Paralleler Aufbau von ZIP-Archiven
Überblick
Die Aspose.ZIP-API bietet die Möglichkeit, ZIP-Archive zu erstellen. Da die Einträge eines solchen Archivs unabhängig voneinander komprimiert werden können, ist es möglich, die Archiverstellung bis zu einem gewissen Grad zu parallelisieren.
ZIP-Multithreaded: Erklärung
Verwenden Sie ParallelOptions, um anzugeben, dass das Archiv mit mehreren CPU-Kernen vorbereitet werden muss.
Die Einstellung ParallelCompressInMemory gibt die Strategie an, die wir für Multitasking wählen. Hier gibt es drei Möglichkeiten:
„ParallelCompressionMode.Never“: Die Komprimierung aller Einträge erfolgt sequentiell. Nur ein CPU-Kern arbeitet an der Komprimierung und löscht komprimierte Daten, sobald sie ankommen.
„ParallelCompressionMode.Always“: Erzwingt die Komprimierung von Einträgen in verschiedenen Threads, unabhängig von der Eintragsgröße, dem verfügbaren Speicher und anderen Faktoren. Jeder CPU-Kern komprimiert gleichzeitig eine Datei und behält seine komprimierten Daten im RAM. Sobald der Eintrag komprimiert ist, wird er in den Ergebnisstrom geleert. Wenn Ihre RAM-Menge klein und die Gesamtgröße einiger N Einträge (wobei N die Anzahl der CPU-Kerne ist) sehr groß ist, kann es vorkommen, dass der gesamte für CLR verfügbare RAM erschöpft ist und OutOfMemoryExcepton auftritt.
„ParallelCompressionMode.Auto“: Der intelligente Modus. Es schätzt die CPU-Kerne, die Größe der Einträge und den verfügbaren Speicher und entscheidet, ob Einträge parallel oder sequentiell komprimiert werden sollen. In diesem Modus werden einige kleinere Einträge parallel komprimiert, andere sequentiell. Aufgrund des hohen Speicherverbrauchs werden LZMA-Einträge nicht parallel komprimiert. Im Allgemeinen ist es sicher, diese Option zu wählen, Aspose.ZIP ist bei Schätzungen vorsichtig und wechselt als Fallback zur sequentiellen Komprimierung. Für diesen Modus gibt es eine weitere Eigenschaft von ParallelOptions – AvailableMemorySize. Für jeden anderen Modus ist es sinnlos. Grob gesagt ist dies die Obergrenze des zugewiesenen Speichers beim Komprimieren von Einträgen mit allen CPU-Kernen in Megabyte. Aspose.ZIP verwendet diese Zahl, um die größte Eintragsgröße zu schätzen, die sicher parallel komprimiert werden kann. Einträge über dem Schwellenwert werden sequentiell komprimiert. AvailableMemorySize ist ein zweischneidiges Schwert: Wenn es bei großen Einträgen zu hoch eingestellt wird, kann es zu RAM-Erschöpfung, intensivem Swap und möglicherweise sogar zu einer Ausnahme wegen nicht genügend Arbeitsspeicher kommen. Bei einer zu niedrigen Einstellung werden die meisten Einträge ohne große Beschleunigung sequentiell komprimiert. Erfahrene Benutzer können es also unter Berücksichtigung eines Kompromisses zuweisen.
Wir empfehlen Ihnen, mit Ihren typischen Daten verschiedene Modi der Parallelkomprimierung auszuprobieren, um herauszufinden, welche Einstellungen in Ihrem Fall die besten sind.
So erstellen Sie ein ZIP-Archiv mit paralleler Komprimierung im C#-Beispiel
Schritte: Erstellen Sie ein ZIP-Archiv mit paralleler Komprimierung in C#
- Öffnen Sie einen Dateistream („FileStream“) in „FileMode.Create“, um eine neue ZIP-Datei („archive.zip“) zu erstellen.
- Initialisieren Sie ein neues „Archive“-Objekt zur Verwaltung von ZIP-Einträgen.
- Verwenden Sie die Methode „CreateEntry“, um mehrere Einträge hinzuzufügen, z. B. „first.bin“ und „last.bin“, und verwenden Sie „File.OpenRead“, um aus den Quelldateien zu lesen (
data1.bin
unddataN.bin
). - Richten Sie „ArchiveSaveOptions“ mit „ParallelOptions“ ein, wobei „ParallelCompressInMemory“ auf „ParallelCompressionMode.Always“ gesetzt ist, um die parallele Komprimierung für eine schnellere Archivierung zu ermöglichen.
- Speichern Sie das Archiv mit den angegebenen Optionen mit der Methode „Speichern“.
1 using (FileStream zipFile = File.Open("archive.zip", FileMode.Create))
2 {
3 using (Archive archive = new Archive())
4 {
5 archive.CreateEntry("first.bin", File.OpenRead("data1.bin"));
6 ...
7 archive.CreateEntry("last.bin", File.OpenRead("dataN.bin"));
8 archive.Save(zipFile, new ArchiveSaveOptions()
9 {
10 ParallelOptions = new ParallelOptions()
11 { ParallelCompressInMemory = ParallelCompressionMode.Always }
12 });
13 }
14 }