Como posso criar rapidamente textos grandes (> 1gb) + arquivos binários com conteúdo “natural”? (C #)

Para fins de teste de compactação, preciso poder criar arquivos grandes, idealmente em formatos de texto, binários e mistos.

O conteúdo dos arquivos não deve ser completamente aleatório nem uniforme.
Um arquivo binário com todos os zeros não é bom. Um arquivo binário com dados totalmente aleatórios também não é bom. Para o texto, um arquivo com seqüências totalmente aleatórias de ASCII não é bom - os arquivos de texto devem ter padrões e freqüências que simulem a linguagem natural, ou código fonte (XML, C #, etc). Texto pseudo-real.O tamanho de cada arquivo individual não é crítico, mas para o conjunto de arquivos, eu preciso que o total seja ~ 8gb.Eu gostaria de manter o número de arquivos em um nível gerenciável, digamos o (10).

Para criar arquivos binários, posso criar um buffer grande e fazer System.Random.NextBytes seguido por FileStream.Write em um loop, como este:

<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>

Com um buffer grande o suficiente, digamos 512k, isso é relativamente rápido, mesmo para arquivos com mais de 2 ou 3GB. Mas o conteúdo é totalmente aleatório, o que não é o que eu quero.

Para arquivos de texto, a abordagem que tomei é usarLorem Ipsum, e repetidamente emiti-lo através de um StreamWriter em um arquivo de texto. O conteúdo é não aleatório e não uniforme, mas tem muitos blocos repetidos idênticos, o que não é natural. Além disso, como o bloco Lorem Ispum é tão pequeno (<1k), ele leva muitos loops e um tempo muito, muito longo.

Nenhum destes é bastante satisfatório para mim.

Eu vi as respostas paraRapidamente criar arquivos grandes em um sistema Windows?. Essas abordagens são muito rápidas, mas acho que elas preenchem o arquivo com zeros, ou dados aleatórios, nenhum dos quais é o que eu quero. Eu não tenho nenhum problema com a execução de um processo externo como contig ou fsutil, se necessário.

Os testes são executados no Windows.
Em vez de criar novos arquivos, faz mais sentido usar apenas arquivos que já existem no sistema de arquivos? Eu não sei de nenhum que seja suficientemente grande.

Que tal começar com um único arquivo existente (talvez c: \ windows \ Microsoft.NET \ Framework \ v2.0.50727 \ Config \ enterprisesec.config.cch para um arquivo de texto) e replicar seu conteúdo muitas vezes? Isso funcionaria com um arquivo de texto ou binário.

Atualmente, tenho uma abordagem que funciona, mas demora muito para ser executada.

Alguém mais resolveu isso?

Existe uma maneira muito mais rápida de escrever um arquivo de texto do que via StreamWriter?

Sugestões?

EDITAR: Eu gosto da ideia de uma cadeia de Markov para produzir um texto mais natural. Ainda precisa enfrentar a questão da velocidade, no entanto.

questionAnswers(8)

yourAnswerToTheQuestion