Более быстрый способ создания случайного текстового файла C # - PullRequest
0 голосов
/ 01 июня 2018

Выходными данными должен быть большой текстовый файл, где каждая строка имеет форму Number.String, текст произвольный:

347. Bus
20175. Yes Yes
15. The same
2. Hello world
178. Tree

Размер файла должен быть указан в байтах.Интересует самый быстрый способ создания файлов размером около 1000 МБ и более.

Вот мой код для генерации случайного текста:

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

Я не знаю, как заставить работать этот код нес размером строк, но с размером МБ.Когда я устанавливаю размер около 1000000000, я получаю OutOfMemoryException.И, может быть, есть более быстрый способ создания индексов

Ответы [ 2 ]

0 голосов
/ 01 июня 2018

Лучше поставить полное исключение в вопросе.Бьюсь об заклад, он показывает на

var result = new string[size];

1000000000 для размера массива строк слишком много, попробуйте запустить это dotnetfiddle , вы получите:

Исключение во время выполнения (строка 12): размеры массива превысили поддерживаемый диапазон.Трассировка стека: [System.OutOfMemoryException: Размеры массива превысили поддерживаемый диапазон.] В Program.Main (): строка 12

Пожалуйста, посмотрите на следующее, почему вы получаете это исключение и чтоОбходной путь.

Каков максимальный размер, который может содержать массив?

Невозможно создать огромные массивы

Ошибка при увеличении количества словарей до 89478457

0 голосов
/ 01 июня 2018
  1. Диск - это ваше узкое место, нет необходимости в параллельной обработке
  2. Нет необходимости хранить все в памяти перед записью

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);
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...