В целях тестирования сжатия мне нужно иметь возможность создавать большие файлы, в идеале в текстовом, двоичном и смешанном форматах.
- Содержимое файлов не должно быть ни случайным, ни однородным.
Бинарный файл со всеми нулями не годится. Бинарный файл с абсолютно случайными данными тоже не годится. Для текста файл с совершенно случайными последовательностями ASCII не годится - текстовые файлы должны иметь шаблоны и частоты, имитирующие естественный язык, или исходный код (XML, C # и т. Д.). Псевдо-реальный текст.
- Размер каждого отдельного файла не критичен, но для набора файлов мне нужно, чтобы общий размер был ~ 8 ГБ.
- Я бы хотел сохранить количество файлов на управляемом уровне, скажем, o (10).
Для создания двоичных файлов я могу создать новый большой буфер и выполнить цикл System.Random.NextBytes, а затем FileStream.Write, например:
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();
}
При достаточно большом буфере, скажем, 512 КБ, это относительно быстро, даже для файлов размером более 2 или 3 ГБ. Но контент абсолютно случайный, а это не то, что я хочу.
Для текстовых файлов я выбрал подход Lorem Ipsum и многократно отправлял его через StreamWriter в текстовый файл. Содержимое неслучайно и неоднородно, но имеет много идентичных повторяющихся блоков, что неестественно. Кроме того, поскольку блок Lorem Ispum очень мал (<1k), он занимает много циклов и очень, очень много времени. </p>
Ничто из этого не является вполне удовлетворительным для меня.
Я видел ответы на Как быстро создать большой файл в системе Windows? . Эти подходы очень быстрые, но я думаю, что они просто заполняют файл нулями или случайными данными, ни один из которых я не хочу. У меня нет проблем с запуском внешнего процесса, такого как contig или fsutil, при необходимости.
Тесты запускаются в Windows.
Вместо того, чтобы создавать новые файлы, имеет ли смысл использовать файлы, уже существующие в файловой системе? Я не знаю ни одного достаточно большого.
Как насчет того, чтобы начать с одного существующего файла (может быть, c: \ windows \ Microsoft.NET \ Framework \ v2.0.50727 \ Config \ enterprisesec.config.cch для текстового файла) и многократно реплицировать его содержимое? Это будет работать с текстовым или двоичным файлом.
В настоящее время у меня есть подход такого рода, но он занимает слишком много времени для запуска.
Кто-нибудь еще решил это?
Есть ли намного более быстрый способ написания текстового файла, чем через StreamWriter?
Предложения
РЕДАКТИРОВАТЬ : Мне нравится идея цепочки Маркова для создания более естественного текста. Тем не менее, необходимо решить проблему скорости.