C# 快速生成随机文本文件的方法#
输出应该是一个大文本文件,其中每行都有表单编号。字符串,文本是随机的:C# 快速生成随机文本文件的方法#,c#,arrays,file,generator,C#,Arrays,File,Generator,输出应该是一个大文本文件,其中每行都有表单编号。字符串,文本是随机的: 347. Bus 20175. Yes Yes 15. The same 2. Hello world 178. Tree 必须以字节为单位指定文件大小。对生成约1000MB及以上文件的最快方式感兴趣 下面是我生成随机文本的代码: public string[] GetRandomTextWithIndexes(int size) { var result = new string[size];
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);
}
}
public string[]GetRandomTextWithIndexes(整数大小)
{
var结果=新字符串[大小];
var sw=Stopwatch.StartNew();
var index=Enumerable.Range(0,size).AsParallel().OrderBy(g=>GenerateRandomNumber(0,5)).ToList();
sw.Stop();
控制台写入线(“队列填充:+sw.eassed”);
sw=秒表。开始新();
Parallel.For(0,size,i=>
{
var text=GetRandomText(GenerateRandomNumber(1,20));
结果[i]=$“{index[i]}.{text}”;
});
sw.Stop();
Console.WriteLine(“文本填充:+sw.passed”);
返回结果;
}
公共字符串GetRandomText(整数大小)
{
var builder=新的StringBuilder();
对于(变量i=0;i
我不知道如何使这段代码不是使用字符串大小,而是使用MBs大小。当我将大小设置为100000000左右时,我会收到OutOfMemoryException
。也许有更快的方法来生成索引
使用(var fs=File.OpenWrite(@“c:\w\test.txt”))
使用(var w=新StreamWriter(fs))
{
对于(变量i=0;i
使用(var fs=File.OpenWrite(@“c:\w\test.txt”))
使用(var w=新StreamWriter(fs))
{
对于(变量i=0;i
最好在问题中加入完整的异常。我敢打赌它会在
var result = new string[size];
1000000000因为字符串数组的大小太大,请尝试运行此操作,您将得到:
运行时异常(第12行):超出了支持的数组维度
范围
堆栈跟踪:
[System.OutOfMemoryException:超出了支持的数组维度
范围]在Program.Main()处:第12行
请查看以下内容,了解为什么会出现该异常以及解决方法
最好在问题中加入完全例外。我敢打赌它会在
var result = new string[size];
1000000000因为字符串数组的大小太大,请尝试运行此操作,您将得到:
运行时异常(第12行):超出了支持的数组维度
范围
堆栈跟踪:
[System.OutOfMemoryException:超出了支持的数组维度
范围]在Program.Main()处:第12行
请查看以下内容,了解为什么会出现该异常以及解决方法
我建议您边写边写,而不是将整个内容作为字符串存储在内存中。更快地处理OutOfMemoryException似乎只能解决部分问题。除非您是编写慢代码的专家,否则要输出到文件中的数据的实际生成将与将数据写入文件所需的时间相形见绌。我不会太担心“优化”生成部分。哦,您不应该在内存中生成整个文件,您应该在生成数据时打开streamwriter并写入它。操作系统非常擅长为您处理缓冲区和缓存。生成一种zip炸弹会更快吗?您能把完整的例外情况放进去吗?我建议您边写边写文件,而不是将整个内容作为字符串存储在内存中。更快地处理OutOfMemoryException似乎只能解决部分问题。除非您是编写慢代码的专家,否则要输出到文件中的数据的实际生成将与将数据写入文件所需的时间相形见绌。我不会太担心“优化”生成部分。哦,您不应该在内存中生成整个文件,您应该在生成数据时打开streamwriter并写入它。操作系统非常擅长为您处理缓冲区和缓存。生成一种zip炸弹会更快吗?您能完全例外吗