Zum Testen der Komprimierung muss ich in der Lage sein, große Dateien zu erstellen, idealerweise in Text-, Binär- und gemischten Formaten.
Zum Erstellen von Binärdateien kann ich einen großen Puffer neu erstellen und System.Random.NextBytes gefolgt von FileStream.Write in einer Schleife wie folgt ausführen:
%Vor%Mit einem ausreichend großen Puffer, sagen wir 512k, ist das relativ schnell, sogar für Dateien über 2 oder 3 GB. Aber der Inhalt ist total zufällig, was ich nicht will.
Bei Textdateien verwende ich Lorem Ipsum und gebe es wiederholt über einen StreamWriter in eine Textdatei Der Inhalt ist nicht zufällig und ungleichmäßig, aber er hat viele identische wiederholte Blöcke, was unnatürlich ist. Da der Lorem-Ispum-Block so klein ist (& lt; 1k), benötigt er viele Schleifen und eine sehr, sehr lange Zeit.
Für mich ist beides nicht zufriedenstellend.
Ich habe die Antworten auf schnell eine große Datei in einem Windows erstellen System? . Diese Ansätze sind sehr schnell, aber ich denke, sie füllen nur die Datei mit Nullen oder zufälligen Daten, von denen beide nicht das sind, was ich will. Ich habe kein Problem mit einem externen Prozess wie Contig oder Fsutil, falls nötig.
Die Tests werden unter Windows ausgeführt.
Anstatt neue Dateien zu erstellen, ist es sinnvoller, nur Dateien zu verwenden, die bereits im Dateisystem vorhanden sind? Ich kenne keine, die ausreichend groß sind.
Wie wäre es mit einer einzelnen vorhandenen Datei (vielleicht c: \ windows \ Microsoft.NET \ Framework \ v2.0.50727 \ Config \ enterprisesec.config.cch für eine Textdatei) zu beginnen und den Inhalt mehrmals zu replizieren? Dies würde mit einer Text- oder Binärdatei funktionieren.
Momentan habe ich einen Ansatz, der funktioniert, aber es dauert zu lange, um ihn auszuführen.
Hat jemand anderes das gelöst?
Gibt es eine viel schnellere Möglichkeit, eine Textdatei als über StreamWriter zu schreiben?
Vorschläge?
BEARBEITEN : Ich mag die Idee einer Markov-Kette, um einen natürlicheren Text zu erzeugen. Trotzdem müssen wir uns dem Thema Geschwindigkeit stellen.
Ich denke, dass Sie nach etwas wie einem Markov-Chain -Prozess suchen, um diese Daten zu generieren. Es ist sowohl stochastisch (randomisiert) als auch strukturiert, da es auf einem endlichen Automaten basiert.
Tatsächlich wurden Markov-Ketten zur Erzeugung von semi-realistisch aussehendem Text in menschlichen Sprachen verwendet. Im Allgemeinen sind sie keine trivialen Dinge, die man richtig analysieren müsste, aber die Tatsache, dass sie bestimmte Eigenschaften aufweisen, sollte gut genug für Sie sein. (Siehe auch Eigenschaften von Markov-Ketten Abschnitt der Seite.) Hoffentlich sollten Sie jedoch sehen, wie Sie ein Design erstellen - zu implementieren, ist es eigentlich ein ziemlich einfaches Konzept. Ihre beste Wette wird wahrscheinlich sein, ein Framework für einen generischen Markov-Prozess zu erstellen und dann entweder die natürliche Sprache oder den Quellcode zu analysieren (je nachdem, was Ihre zufälligen Daten emulieren sollen), um Ihren Markov-Prozess zu "trainieren". Dies sollte Ihnen letztendlich qualitativ hochwertige Daten hinsichtlich Ihrer Anforderungen liefern. Es lohnt sich, die Mühe zu machen, wenn Sie diese enorme Länge von Testdaten benötigen.
Für Text könnten Sie das Stapelüberlauf Community Dump gibt es 300meg Daten dort. Es dauert nur etwa 6 Minuten, um mit der App, die ich geschrieben habe, in eine db zu laden und wahrscheinlich ungefähr die gleiche Zeit, um alle Beiträge in Textdateien zu speichern, die Ihnen leicht zwischen 200.000 bis 1 Million Textdateien geben würden, abhängig von Ihrem Ansatz (mit dem zusätzlichen Bonus, dass Quelle und XML gemischt sind).
Sie könnten auch etwas wie den Wikipedia-Dump verwenden, er scheint im MySQL-Format zu versenden, was es sehr einfach machen würde arbeiten mit.
Wenn Sie nach einer großen Datei suchen, die Sie aufteilen können, können Sie für binäre Zwecke entweder eine VM vmdk oder eine lokal gerippte DVD verwenden.
Bearbeiten
Mark erwähnt das Projekt Gutenberg Download, das ist auch eine wirklich gute Quelle für Text (und Audio), die für download verfügbar ist über BitTorrent .
Du könntest dir immer einen kleinen Webcrawler schreiben ...
UPDATE Beruhige dich Jungs, das wäre eine gute Antwort, wenn er nicht gesagt hätte, dass er schon eine Lösung hat, die "zu lange dauert".
Ein schneller Check hier würde darauf hindeuten, dass das Herunterladen von 8 GB alles relativ lange dauern würde .
Ich denke, das Windows-Verzeichnis wird wahrscheinlich eine gute Quelle für Ihre Bedürfnisse sein. Wenn Sie nach Text suchen, würde ich durch jedes der Verzeichnisse, die nach .txt-Dateien suchen, recursieren und sie durchlaufen, indem ich sie so oft wie nötig in die Ausgabedatei kopiere, um die richtige Datei zu erhalten.
Sie könnten dann einen ähnlichen Ansatz für Binärdateien verwenden, indem Sie nach .exes oder .dlls suchen.
Für Textdateien könnten Sie etwas Erfolg haben, indem Sie eine englische Wortliste nehmen und einfach willkürlich Wörter daraus ziehen. Das wird keinen echten englischen Text erzeugen, aber ich würde vermuten, dass es eine Buchstabenhäufigkeit erzeugen würde, die ähnlich ist, wie Sie es auf Englisch finden.
Für einen strukturierteren Ansatz könnten Sie eine Markov-Kette verwenden, die auf einigen großen englischen Texten trainiert wurde.
Warum nimmst du nicht Lorem Ipsum und erstellst vor der Ausgabe eine lange Zeichenfolge im Speicher. Der Text sollte mit einer Rate von O (log n) erweitert werden, wenn Sie die Menge an Text jedes Mal verdoppeln. Sie können sogar die Gesamtlänge der Daten vor der Hand berechnen, so dass Sie nicht darunter leiden müssen, Inhalte in eine neue Zeichenfolge / ein neues Array kopieren zu müssen.
Da Ihr Puffer nur 512 KB groß ist oder wie Sie ihn eingestellt haben, müssen Sie nur so viele Daten generieren, bevor Sie ihn schreiben, da dies nur der Betrag ist, den Sie gleichzeitig an die Datei senden können. Sie werden den gleichen Text immer und immer wieder schreiben, also verwenden Sie einfach das Original 512k, das Sie das erste Mal erstellt haben.
Wikipedia eignet sich hervorragend für Komprimierungstests für gemischte Texte und Binärdateien. Wenn Sie Benchmark-Vergleiche benötigen, kann die Hutter-Preis-Site eine obere Grenze für die ersten 100 MB von Wikipedia liefern. Der aktuelle Rekord ist ein Verhältnis von 6,26, 16 mb.
Danke für die schnelle Eingabe. Ich beschloss, die Probleme der Geschwindigkeit und "Natürlichkeit" getrennt zu betrachten. Für die Erstellung von natürlichem Text habe ich ein paar Ideen kombiniert.
UPDATE : Was das zweite Problem betrifft, die Geschwindigkeit - ich habe den Ansatz gewählt, um so viel IO wie möglich zu eliminieren, dies geschieht auf meinem schlechten Laptop mit einer 5400rpm Mini-Spindel. Was mich dazu brachte, das Problem völlig neu zu definieren - anstatt eine FILE mit zufälligem Inhalt zu erzeugen, was ich wirklich will, ist der zufällige Inhalt. Mit einem Stream, der sich um eine Markov-Kette wickelt, kann ich Text im Speicher erzeugen und ihn zum Kompressor streamen, wodurch 8 g Schreib- und 8 g Lesevorgänge entfallen. Für diesen speziellen Test muss ich den Komprimierungs- / Dekomprimierungs-Umlauf nicht überprüfen, so dass ich den ursprünglichen Inhalt nicht beibehalten muss. Der Streaming-Ansatz hat also gut funktioniert, um die Dinge massiv zu beschleunigen. Es hat 80% der Zeit gekürzt.
Ich habe noch nicht herausgefunden, wie man die binäre Erzeugung macht, aber es wird wahrscheinlich etwas Analoges sein.
Nochmals vielen Dank für all die hilfreichen Ideen.
Tags und Links .net c# windows testing filesystems