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
ParallelOptionsf�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}