c# - 生成随机文本文件 C# 的更快方法
问题描述
输出应该是一个大文本文件,其中每一行的格式为 Number.String,文本是随机的:
347. Bus
20175. Yes Yes
15. The same
2. Hello world
178. Tree
文件大小必须以字节为单位。有兴趣以最快的方式生成大约 1000MB 及以上的文件。
有我生成随机文本的代码:
public string[] GetRandomTextWithIndexes(int size)
{
var result = new string[size];
var sw = Stopwatch.StartNew();
var indexes = Enumerable.Range(0, size).AsParallel().OrderBy(g => GenerateRandomNumber(0, 5)).ToList();
sw.Stop();
Console.WriteLine("Queue fill: " + sw.Elapsed);
sw = Stopwatch.StartNew();
Parallel.For(0, size, i =>
{
var text = GetRandomText(GenerateRandomNumber(1, 20));
result[i] = $"{indexes[i]}. {text}";
});
sw.Stop();
Console.WriteLine("Text fill: " + sw.Elapsed);
return result;
}
public string GetRandomText(int size)
{
var builder = new StringBuilder();
for (var i = 0; i < size; i++)
{
var character = LegalCharacters[GenerateRandomNumber(0, LegalCharacters.Length)];
builder.Append(character);
}
return builder.ToString();
}
private int GenerateRandomNumber(int min, int max)
{
lock (_synlock)
{
if (_random == null)
_random = new Random();
return _random.Next(min, max);
}
}
我不知道如何使此代码不是使用字符串大小而是使用 MB 大小。当我将大小设置为大约 1000000000 时,我收到OutOfMemoryException
. 也许有一些更快的方法来生成索引
解决方案
- 磁盘是你的瓶颈,不需要并行处理
- 无需在写入之前将所有内容存储在内存中
using (var fs = File.OpenWrite(@"c:\w\test.txt"))
using (var w = new StreamWriter(fs))
{
for (var i = 0; i < size; i++)
{
var text = GetRandomText(GenerateRandomNumber(1, 20));
var number = GenerateRandomNumber(0, 5);
var line = $"{number}. {text}";
w.WriteLine(line);
}
}
推荐阅读
- javascript - 我的 js 平台游戏中的碰撞检测。无法停止物体,但检测有效
- docker - 为什么 docker 在 docker 容器中找不到 JSON 文件的 Env 变量?
- project - 如何使用快速绘图数据集来识别包含许多类别的绘图
- matlab - 为什么这个函数没有被调用?
- javascript - 网格布局的 CSS 调整大小问题
- c - 错误 gcc - 未定义对符号 '__getauxval@@GLIBC_2.17' 的引用
- leaflet - 在传单中使用条形图和散点图的问题
- c++ - 什么时候可以通过捕获异常来真正解决问题?
- azure-devops - Azure DevOps 管道存储库触发器不会触发
- powershell - 使用 PowerShell 脚本安装 D365 SDK 工具错误