Как я могу быстро создавать большие (> 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?
РЕДАКТИРОВАТ: Мне нравится идея создания цепочки Маркова для создания более естественного текста. Тем не менее, все еще нужно противостоять проблеме скорости.