Wie kann ich schnell große (> 1 GB) Text- und Binärdateien mit „natürlichem“ Inhalt erstellen? (C #)

Zum Testen der Komprimierung muss ich in der Lage sein, große Dateien zu erstellen, idealerweise in Text-, Binär- und gemischten Formaten.

Der Inhalt der Dateien sollte weder völlig zufällig noch einheitlich sein.
Eine Binärdatei mit allen Nullen ist nicht gut. Eine Binärdatei mit völlig zufälligen Daten ist auch nicht gut. Für Text ist eine Datei mit völlig zufälligen ASCII-Sequenzen nicht geeignet. Die Textdateien sollten Muster und Häufigkeiten aufweisen, die die natürliche Sprache oder den Quellcode (XML, C # usw.) simulieren. Pseudorealer Text.Die Größe jeder einzelnen Datei ist nicht kritisch, aber für die Dateigruppe muss die Gesamtgröße ~ 8 GB betragen.Ich möchte die Anzahl der Dateien auf einem überschaubaren Niveau halten, sagen wir o (10).

Zum Erstellen von Binärdateien kann ich einen großen Puffer neu erstellen und System.Random.NextBytes gefolgt von FileStream.Write in einer Schleife ausführen:

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

Wenn der Puffer groß genug ist, sagen wir 512 KB, ist dies relativ schnell, selbst für Dateien über 2 oder 3 GB. Aber der Inhalt ist völlig zufällig, was ich nicht will.

Für Textdateien habe ich den folgenden Ansatz gewähltLorem Ipsumund geben Sie es wiederholt über einen StreamWriter in eine Textdatei aus. Der Inhalt ist nicht zufällig und nicht einheitlich, hat aber viele identische wiederholte Blöcke, was unnatürlich ist. Da der Lorem-Ispum-Block so klein ist (<1k), dauert es auch viele Schleifen und eine sehr, sehr lange Zeit.

Beides ist für mich nicht ganz zufriedenstellend.

Ich habe die Antworten auf ... gesehenSchnelle Erstellung großer Dateien auf einem Windows-System?. Diese Ansätze sind sehr schnell, aber ich denke, sie füllen die Datei nur mit Nullen oder zufälligen Daten, von denen keines das ist, was ich will. Ich habe kein Problem damit, einen externen Prozess wie contig oder fsutil auszuführen, falls erforderlich.

Die Tests laufen unter Windows.
Ist es sinnvoller, nur Dateien zu verwenden, die bereits im Dateisystem vorhanden sind, als neue Dateien zu erstellen? Ich kenne keine, die groß genug sind.

Beginnen Sie mit einer einzelnen vorhandenen Datei (möglicherweise C: \ Windows \ Microsoft.NET \ Framework \ v2.0.50727 \ Config \ enterprisesec.config.cch für eine Textdatei) und replizieren Sie den Inhalt mehrmals. Dies würde entweder mit einer Text- oder einer Binärdatei funktionieren.

Derzeit habe ich einen Ansatz, der funktioniert, der aber zu lange dauert.

Hat das noch jemand gelöst?

Gibt es eine viel schnellere Methode zum Schreiben einer Textdatei als mit StreamWriter?

Vorschläge?

BEARBEITEN: Ich mag die Idee einer Markov-Kette, um einen natürlicheren Text zu erzeugen. Dennoch muss man sich mit dem Thema Geschwindigkeit auseinandersetzen.

Antworten auf die Frage(8)

Ihre Antwort auf die Frage