.NET使用Bogus生成大量随机数据

.NET如何生成大量随机数据

在演示Demo、数据库脱敏、性能测试中,有时需要生成大量随机数据。Bogus就是.NET中优秀的高性能、合理、支持多语言的随机数据生成库。

BogusGithub链接:https://github.com/bchavez/Bogus,图标如下:

安装Bogus

目前Bogus最新版是28.0.2,本文演示基本该版本,不保证官方以后会不会修改本文的使用方式。

使用Powershell

PM> Install-Package Bogus -Version 28.0.2

或者使用PackageReference

<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>,是一个状态机,可以永久生成数据。

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左右。

我计划今后如需要做性能测试或者演示,将使用该文件作为基准数据,已经上传到Github,该文件可以从https://github.com/sdcb/blog-data/tree/master/2019/20190821-generate-lorem-data下载。

出处:微信公众号【DotNet骚操作】
原文链接:https://www.cnblogs.com/sdflysha/p/20190821-generate-lorem-data.html

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

时间: 2024-08-29 14:43:18

.NET使用Bogus生成大量随机数据的相关文章

mock的命名用一(生成随机数据)

Mock.Random 是一个工具类,用于生成各种随机数据. Mock.Random 的方法在数据模板中称为『占位符』,书写格式为 @占位符(参数 [, 参数]) . var Random = Mock.Random Random.email() // => "[email protected]" Mock.mock('@email') // => "[email protected]" Mock.mock( { email: '@email' } )

机器学习算法的随机数据生成

在学习机器学习算法的过程中,我们经常需要数据来验证算法,调试参数.但是找到一组十分合适某种特定算法类型的数据样本却不那么容易.还好numpy, scikit-learn都提供了随机数据生成的功能,我们可以自己生成适合某一种模型的数据,用随机数据来做清洗,归一化,转换,然后选择模型与算法做拟合和预测.下面对scikit-learn和numpy生成数据样本的方法做一个总结. 1. numpy随机数据生成API numpy比较适合用来生产一些简单的抽样数据.API都在random类中,常见的API有:

Python一个可以生成随机数据的库

发现一个十分有用的库 faker,作用竟是可以生成各种各样的随机数据 新版本要使用 pip install fake-factory 而不能直接 pip install fake git:https://github.com/joke2k/faker文档:http://fake-factory.readthedocs.io/en/master/index.html 文档十分清楚, 用法就是这样的了, #-*- coding:utf-8 -*- from faker import Factory

随机数据生成与对拍

# 随机数据生成与对拍 引言 在漫长的\(OI\)生涯中,你肯定遇到过这些情况 在OI赛制下,你写了一份你自认为是正解的代码,但是你不确定自己是否考虑到了所有的细节,你不敢轻易提交 对于有些无法获得数据的题目,你不知道自己错在了哪里 对于能够获得数据的题目,你拿到的数据都是上万级别的数据,难以\(Debug\). 这时候,我们就可以试试随机数据生成与对拍` 什么是随机数据生成? 顾名思义,就是针对我们的需求生成随机的数据.比如生成随机的整数序列,生成随机的树,生成随机的图. 什么是对拍? 对拍说

随机数据的生成

import numpy as np # (1)random(d0,d1,....dn)用来生成d0*d1*....*dn维的数组.数组的值在[0,1)之间 np.random.rand(3,2,2)#生成一个3*2*2的数组 array([[[0.10141273, 0.97087629], [0.57045156, 0.62780166]], [[0.15425975, 0.21828791], [0.03630166, 0.60174227]], [[0.20345412, 0.51719

MySQL查询随机数据的4种方法和性能对比

从MySQL随机选取数据也是我们最常用的一种发发,其最简单的办法就是使用”ORDER BY RAND()”,本文介绍了包括ORDER BY RAND()的4种获取随机数据的方法,并分析了各自的优缺点. 下面从以下四种方案分析各自的优缺点.方案一: 复制代码 代码如下: SELECT * FROM `table` ORDER BY RAND() LIMIT 0,1; 这种方法的问题就是非常慢.原因是因为MySQL会创建一张零时表来保存所有的结果集,然后给每个结果一个随机索引,然后再排序并返回.有几

Python_生成大量随机信息

1 #coding=utf-8 2 import random 3 import string 4 import codecs 5 ''' 6 演示如何使用Python标准库random来生成随机数据,这在需要 7 ''' 8 #常用汉字Unicode编码表 9 StringBase = '\u7684\u4e00\u4e86\u662f\u6211\u4e0d\u5728\u4eba\u4eec\u6709\u6765\u4ed6\u8fd9\u4e0a\u7740\u4e2a\u5730\u

快速生成大量随机大小的文件

要生成大量随机大小的文件,最简单的方法是for循环N次. 例如,生成100W个0-16K大小的小文件(尝试时请改小一点数量,不然时间要很久): tmp_dir=/tmp/temp for i in {1..1000000};do dd if=/dev/zero of=$tmp_dir/${i}.log bs=`shuf -n 1 -i 0-16`k count=1 &>/dev/null done 这里使用dd命令从/dev/zero中取数据填充小文件,其中tmp_dir变量是存放大量小文件

如何在mysql数据库生成百万条数据来测试页面加载速度

1.首先复制一条sql 在复制前,需要确定该记录是否有主键 若无,则代码非常简单, insert into gl_energy_meter_data SELECT * from gl_energy_meter_data where dosage="12432"; 复制的表名↑                                              粘贴的表名↑                        ↑ 某个字段的值最好唯一 若有主键,一般是ID,则需要随机生成