更快的方式生成随机文本文件C#

时间:2018-06-01 17:28:41

标签: c# arrays file generator

输出应该是一个大文本文件,其中每一行的形式为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。也许有一些更快的方法来生成索引

2 个答案:

答案 0 :(得分:6)

  1. 磁盘是您的瓶颈,无需并行处理
  2. 在编写
  3. 之前无需将所有内容存储在内存中

    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);
        }
    }
    

答案 1 :(得分:0)

最好在问题中加入完整的例外。我打赌它显示在

var result = new string[size];

字符串数组的大小为1000000000太多,尝试运行此dotnetfiddle,你会得到:

  

运行时异常(第12行):支持超出数组维度   范围。   堆栈跟踪:   [System.OutOfMemoryException:支持超出数组维度   在Program.Main():第12行

请查看以下内容,了解您获得该异常的原因以及解决方法。

What is the Maximum Size that an Array can hold?

Can't create huge arrays

Error when Dictionary count is bigger as 89478457