Parallele Zusammenstellung von ZIP-Archiven
Übersicht
Aspose.ZIP API bietet die Möglichkeit, ZIP-Archive zusammenzustellen. Da die Einträge eines solchen Archivs unabhängig voneinander komprimiert werden können, ist es möglich, die Erstellung von Archiven 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.
Das Setzen von ParallelCompressInMemory
(
getParallelCompressInMemory/
setParallelCompressInMemory) gibt an, welche Strategie wir für Multitasking wählen.
Hier sind drei Optionen:
ParallelCompressionMode.Never": Die Komprimierung aller Einträge erfolgt sequentiell. Nur ein CPU-Kern arbeitet an der Komprimierung und spült die komprimierten Daten, wenn sie anfallen.
ParallelCompressionMode.Always": Er erzwingt die Komprimierung von Einträgen in verschiedenen Threads unabhängig von der Größe des Eintrags, dem verfügbaren Speicher und anderen Faktoren. Jeder CPU-Kern komprimiert gleichzeitig eine Datei und behält die komprimierten Daten im RAM. Sobald der Eintrag komprimiert ist, wird er in den Ergebnisstrom gespült. Wenn der RAM-Speicher klein ist und die Gesamtgröße von N Einträgen (wobei N die Anzahl der CPU-Kerne ist) sehr groß ist, kann es passieren, dass der gesamte für die CLR verfügbare RAM-Speicher erschöpft ist und eine OutOfMemoryExcepton auftritt.
ParalleleKomprimierungMode.Auto: Der intelligente Modus. Er schaetzt die CPU-Kerne, die Groesse der Eintraege und den verfuegbaren Speicher und entscheidet, ob die Eintraege parallel oder sequentiell komprimiert werden sollen. In diesem Modus werden einige kleinere Einträge parallel und andere sequentiell komprimiert. Im Allgemeinen ist es sicher, diese Option zu wählen, Aspose.ZIP ist vorsichtig mit Schätzungen und schaltet auf sequenzielle Kompression als Fallback. Es gibt eine weitere Eigenschaft von
ParallelOptions
für diesen Modus -AvailableMemorySize
( getAvailableMemorySize/ setAvailableMemorySize). Für alle anderen Modi ist sie sinnlos. Grob gesagt handelt es sich um 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 Größe eines Eintrags abzuschätzen, der sicher parallel komprimiert werden kann. Einträge, die über dem Schwellenwert liegen, werden sequentiell komprimiert. AvailableMemorySize" ist ein zweischneidiges Schwert: Wird es bei großen Einträgen zu hoch eingestellt, kann es zur Erschöpfung des Arbeitsspeichers, zu intensivem Swap und sogar zu einer “Out of Memory”-Ausnahme führen. Ist er zu niedrig eingestellt, werden die meisten Einträge sequentiell komprimiert, ohne dass dies zu einer wesentlichen Beschleunigung führt. Daher können erfahrene Benutzer den Wert unter Berücksichtigung eines Kompromisses festlegen.
Wir empfehlen Ihnen, verschiedene Modi der parallelen Komprimierung für Ihre typischen Daten auszuprobieren, um herauszufinden, welche Einstellungen in Ihrem Fall die besten sind.
Beispiel
1try (FileOutputStream zipFile = new FileOutputStream("archive.zip")) {
2 try (Archiv archive = new Archive()) {
3 archive.createEntry("first.bin", "data1.bin");
4 ...
5 archive.createEntry("last.bin", "dataN.bin");
6 ParallelOptions parallelOptions = new ParallelOptions();
7 parallelOptions.setParallelCompressInMemory(ParallelCompressionMode.Always);
8 ArchiveSaveOptions options = new ArchiveSaveOptions();
9 options.setParallelOptions(parallelOptions);
10 archive.save(zipFile, options);
11 }
12} catch (IOException ex) {
13 System.out.println(ex);
14}