.NET使用Bogus生成大量隨機數據(轉載)

原文地址:https://www.cnblogs.com/sdflysha/p/20190821-generate-lorem-data.htmlhtml

在演示Demo、數據庫脫敏、性能測試中,有時須要生成大量隨機數據。Bogus就是.NET中優秀的高性能、合理、支持多語言的隨機數據生成庫。git

BogusGithub連接:https://github.com/bchavez/Bogus,圖標以下:github

bogus

安裝Bogus

目前Bogus最新版是28.0.2,本文演示基本該版本,不保證官方之後會不會修改本文的使用方式。shell

使用Powershell數據庫

PM> Install-Package Bogus -Version 28.0.2

或者使用PackageReferencejson

<PackageReference Include="Bogus" Version="28.0.2" />

使用

個人數據生成代碼以下(代碼使用LINQPad運行,能夠幾乎複製到Visual Studio中運行,效果同樣,其中.Dump()LINQPad特有方法):緩存

void Main() { var userGenerator = new Faker<User>() .RuleFor(x => x.Id, x => x.IndexFaker + 1) .RuleFor(x => x.Gender, x => x.Person.Gender) .RuleFor(x => x.FirstName, (x, u) => x.Name.FirstName(u.Gender)) .RuleFor(x => x.LastName, (x, u) => x.Name.LastName(u.Gender)) .RuleFor(x => x.Email, (x, u) => x.Internet.Email(u.FirstName, u.LastName)) .RuleFor(x => x.BirthDate, x => x.Person.DateOfBirth) .RuleFor(x => x.Company, x => x.Person.Company.Name) .RuleFor(x => x.Phone, x => x.Person.Phone) .RuleFor(x => x.Website, x => x.Person.Website) .RuleFor(x => x.SSN, x => x.Person.Ssn()); userGenerator.GenerateForever().Take(10).Dump(); } class User { public int Id { get; set; } public Bogus.DataSets.Name.Gender Gender { get; set; } public string FirstName { get; set; } public string LastName { get; set; } public string Email { get; set; } public DateTime BirthDate { get; set; } public string Company { get; set; } public string Phone { get; set; } public string Website { get; set; } public string SSN { get; set; } }

生成的數據如圖所示:
性能

注意細節,姓名FirstName/LastName是會根據性別Gender來隨機生成的,而後郵箱Email字段也會根據FirstName/LastName來相應地生成,並不是徹底隨機,毫無規律。這些規則是經過.RuleFor()第二個回調的第二個字段來決定的:測試

.RuleFor(x => x.FirstName, (x, u) => x.Name.FirstName(u.Gender)) // 根據Gender生成FirstName .RuleFor(x => x.LastName, (x, u) => x.Name.LastName(u.Gender)) // 根據Gender生成LastName .RuleFor(x => x.Email, (x, u) => x.Internet.Email(u.FirstName, u.LastName)) // 根據姓名生成郵箱

最後的.GenerateForever返回了一個IEnumerable<User>,是一個狀態機,能夠永久生成數據。spa

Bogus也提供了一次性生成緩存數據的方法:List<User> Generate(int count)。但因爲我可能將這些數據作從此博客文章的性能測試原始數據,數據量可能會很是大,若是將這些數據緩存起來將很是浪費內存,而且影響性能。所以本例中我使用GenerateForever來生成原始數據。

經過.NET Core 3.0最新提供的System.Text.Json裏面的JsonSerializerUtf8JsonWriter,我可能以極其高效的方法將這些測試數據序列化爲JSON,而後保存到磁盤中:

string path = Environment.GetFolderPath(Environment.SpecialFolder.Desktop) + @"\test-data.json"; using var file = File.Create(path); using var writer = new Utf8JsonWriter(file, new JsonWriterOptions { Indented = true }); var data = userGenerator.GenerateForever().Take(6_0000); JsonSerializer.Serialize(writer, data); Process.Start("explorer", @$"/select, ""{path}""".Dump()); // 資源管理器打開test-data.json文件夾

演示和下載

最後示例數據以下:

一共6萬條數據,每條數據有10個字段,test-data.json19,166 KB

能夠用以下代碼將這6萬條數據加載到.NET內存:

void Main() { string path = @"C:\Users\sdfly\Desktop\test-data\test-data.json"; byte[] bytes = File.ReadAllBytes(path); var users = JsonSerializer.Deserialize<List<User>>(bytes); // 數據分析演示 users.GroupBy(x => x.Email[x.Email.IndexOf('@')..]) .Select(x => new { Host = x.Key, Count = x.Count() }) .Dump(); } class User { public int Id { get; set; } public int Gender { get; set; } public string FirstName { get; set; } public string LastName { get; set; } public string Email { get; set; } public DateTime BirthDate { get; set; } public string Company { get; set; } public string Phone { get; set; } public string Website { get; set; } public string SSN { get; set; } }

結果以下:

全部郵件都是hotmail.com/gmail.com/yahoo.com三種郵箱的均勻分佈,每種大約都在20000左右。

相關文章
相關標籤/搜索