前言在演示Demo、数据库脱敏、性能测试中,有时需要生成大量随机数据 。Bogus就是.NET中优秀的高性能、合理、支持多语言的随机数据生成库 。
Bogus的Github链接:https://github.com/bchavez/Bogus,图标如下:
文章插图
安装Bogus【.NET如何生成大量随机数据】目前Bogus最新版是28.0.2,本文演示基本该版本,不保证官方以后会不会修改本文的使用方式 。
使用Powershell安装:
PM> Install-Package Bogus -Version 28.0.2
或者使用PackageReference:<PackageReference Include="Bogus" Version="28.0.2" />
使用Bogus我的数据生成代码如下(代码使用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>,是一个状态机,可以永久生成数据 。Bogus也提供了一次性生成缓存数据的方法:List<User> Generate(int count) 。但由于我可能将这些数据做今后博客文章的性能测试原始数据,数据量可能会非常大,如果将这些数据缓存起来将非常浪费内存,并且影响性能 。因此本例中我使用GenerateForever来生成原始数据 。
通过.NET Core 3.0最新提供的System.Text.Json里面的JsonSerializer和Utf8JsonWriter,我可能以极其高效的方法将这些测试数据序列化为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 = https://www.isolves.com/it/cxkf/yy/net/2019-09-02/userGenerator.GenerateForever.Take(6_0000);
JsonSerializer.Serialize(writer, data);
Process.Start("explorer", @$"/select, ""{path}""".Dump); // 资源管理器打开test-data.json文件夹
演示和下载最后示例数据如下:
文章插图
一共6万条数据,每条数据有10个字段,test-data.json共19,166 KB 。
可以用如下代码将这6万条数据加载到.NET内存:
void Main
{
string path = @"C:UserssdflyDesktoptest-datatest-data.json";
byte bytes = File.ReadAllBytes(path);
var users = JsonSerializer.Deserialize<List<User>>(bytes);
// 数据分析演示
推荐阅读
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- 家用路由器设置不求人 如何设置无线路由器
- 上网行为管理如何应对mac地址克隆和IP盗用
- 春节来临你该如何喝茶
- 被降薪?被调岗?别再傻乎乎地挨宰了,点进来,教你如何维权
- 吃不完的葱如何保存,放一个月也不会坏,有需要的收藏
- 如何申请公租房?
- 买来的房子有他人户口怎么办?购买二手房如何防范户口纠纷
- 如何找回被删除的好友 qq恢复好友
- 如何运营好一个淘宝店铺 淘宝店铺运营规划方案
- 黄褐斑是如何形成的