¿Cómo puedo crear rápidamente archivos de texto + binarios grandes (> 1 gb) con contenido "natural"? (DO#)
Para propósitos de prueba de compresión, necesito poder crear archivos grandes, idealmente en formato de texto, binario y mixto.
El contenido de los archivos no debe ser completamente aleatorio ni uniforme.Un archivo binario con todos los ceros no es bueno. Un archivo binario con datos totalmente aleatorios tampoco es bueno. Para el texto, un archivo con secuencias totalmente aleatorias de ASCII no es bueno: los archivos de texto deben tener patrones y frecuencias que simulen el lenguaje natural o el código fuente (XML, C #, etc.). Texto pseudo-real.El tamaño de cada archivo individual no es crítico, pero para el conjunto de archivos, necesito que el total sea de ~ 8 gb.Me gustaría mantener el número de archivos en un nivel manejable, digamos o (10).
Para crear archivos binarios, puedo crear un búfer grande y hacer System.Random.NextBytes seguido de FileStream.Write en un bucle, 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>
Con un búfer lo suficientemente grande, digamos 512k, esto es relativamente rápido, incluso para archivos de más de 2 o 3 gb. Pero el contenido es totalmente aleatorio, que no es lo que quiero.
Para archivos de texto, el enfoque que he tomado es utilizarLorem Ipsum, y repetidamente emitirlo a través de un StreamWriter en un archivo de texto. El contenido no es aleatorio ni uniforme, pero tiene muchos bloques repetidos idénticos, lo que no es natural. Además, debido a que el bloque de Lorem Ispum es tan pequeño (<1k), toma muchos bucles y un tiempo muy, muy largo.
Ninguno de estos es bastante satisfactorio para mí.
He visto las respuestas a¿Crear rápidamente un archivo grande en un sistema de Windows?. Esos enfoques son muy rápidos, pero creo que simplemente llenan el archivo con ceros o datos aleatorios, ninguno de los cuales es lo que quiero. No tengo ningún problema con ejecutar un proceso externo como contig o fsutil, si es necesario.
Las pruebas se ejecutan en Windows.
En lugar de crear nuevos archivos, ¿tiene más sentido simplemente usar archivos que ya existen en el sistema de archivos? No conozco a ninguno que sea lo suficientemente grande.
¿Qué hay de comenzar con un solo archivo existente (tal vez c: \ windows \ Microsoft.NET \ Framework \ v2.0.50727 \ Config \ enterprisesec.config.cch para un archivo de texto) y replicar su contenido muchas veces? Esto funcionaría con un archivo de texto o binario.
Actualmente tengo un enfoque que funciona, pero tarda mucho en ejecutarse.
¿Alguien más ha resuelto esto?
¿Existe una forma mucho más rápida de escribir un archivo de texto que a través de StreamWriter?
Sugerencias?
EDITAR: Me gusta la idea de una cadena de Markov para producir un texto más natural. Sin embargo, todavía es necesario enfrentar el problema de la velocidad.