Как я могу быстро создавать большие (> 1 ГБ) текстовые + двоичные файлы с «естественным» содержимым? (С #)

Для тестирования сжатия мне нужно иметь возможность создавать большие файлы, в идеале в текстовом, двоичном и смешанном форматах.

Содержимое файлов не должно быть ни случайным, ни однородным.
Бинарный файл со всеми нулями не годится. Бинарный файл с абсолютно случайными данными тоже не годится. Для текста файл с совершенно случайными последовательностями ASCII не годится - текстовые файлы должны иметь шаблоны и частоты, имитирующие естественный язык, или исходный код (XML, C # и т. Д.). Псевдо-реальный текст. Размер каждого отдельного файла не критичен, но для набора файлов мне нужно, чтобы общий объем был ~ 8 ГБ. Я бы хотел сохранить количество файлов на приемлемом уровне, скажем, o (10).

Для создания бинарных файлов я могу создать большой буфер и выполнить цикл System.Random.NextBytes, а затем FileStream.Write, например:

<code>Int64 bytesRemaining = size;
byte[] buffer = new byte[sz];
using (Stream fileStream = new FileStream(Filename, FileMode.Create, FileAccess.Write))
{
    while (bytesRemaining > 0)
    {
        int sizeOfChunkToWrite = (bytesRemaining > buffer.Length) ? buffer.Length : (int)bytesRemaining;
        if (!zeroes) _rnd.NextBytes(buffer);
        fileStream.Write(buffer, 0, sizeOfChunkToWrite);
        bytesRemaining -= sizeOfChunkToWrite;
    }
    fileStream.Close();
}
</code>

При достаточно большом буфере, скажем, 512 Кб, это относительно быстро, даже для файлов размером более 2 или 3 Гб. Но контент абсолютно случайный, а это не то, что я хочу.

Для текстовых файлов я выбрал подходLorem Ipsum, и повторно отправлять его через StreamWriter в текстовый файл. Содержимое неслучайно и неоднородно, но имеет много идентичных повторяющихся блоков, что неестественно. Кроме того, поскольку блок Lorem Ispum очень мал (<1k), он занимает много циклов и очень, очень много времени.

Ни то, ни другое мне не подходит.

Я видел ответы на Быстро создать большой файл в системе Windows?. Эти подходы очень быстрые, но я думаю, что они просто заполняют файл нулями или случайными данными, ни один из которых я не хочу. У меня нет проблем с запуском внешнего процесса, такого как contig или fsutil, если это необходимо.

Тесты выполняются в Windows.
Вместо того, чтобы создавать новые файлы, имеет ли смысл использовать файлы, уже существующие в файловой системе? Я не знаю ни одного достаточно большого.

Как насчет того, чтобы начать с одного существующего файла (может быть, c: \ windows \ Microsoft.NET \ Framework \ v2.0.50727 \ Config \ enterprisesec.config.cch для текстового файла) и многократно реплицировать его содержимое? Это будет работать с текстовым или двоичным файлом.

В настоящее время у меня есть подход, который работает, но это занимает слишком много времени.

Кто-нибудь еще решил это?

Есть ли гораздо более быстрый способ написания текстового файла, чем через StreamWriter?

Suggestions?

РЕДАКТИРОВАТ: Мне нравится идея создания цепочки Маркова для создания более естественного текста. Тем не менее, все еще нужно противостоять проблеме скорости.

Ответы на вопрос(8)

Ваш ответ на вопрос