Composition parallèle d'archives ZIP
Aperçu
L’API Aspose.ZIP permet de composer des archives ZIP. Comme les entrées d’une telle archive peuvent être compressées indépendamment, il est possible de paralléliser la création de l’archive dans une certaine mesure.
ZIP multithreaded : explication
Utilisez ParallelOptions pour indiquer que l’archive doit être préparée avec plusieurs cœurs de CPU.
Le réglage de ParallelCompressInMemory
(
getParallelCompressInMemory/
setParallelCompressInMemory) indique la stratégie que nous choisissons pour le multitâche.
Voici trois options :
ParallelCompressionMode.Never
: la compression de toutes les entrées est séquentielle. Un seul cœur de CPU travaille sur la compression et évacue les données compressées au fur et à mesure qu’elles arrivent.ParallelCompressionMode.Always
: Il force la compression des entrées dans différents threads indépendamment de la taille de l’entrée, de la mémoire disponible et d’autres facteurs. Chaque cœur de CPU compresse simultanément un fichier en conservant les données compressées dans la RAM. Une fois l’entrée compressée, elle est transférée dans le flux de résultats. Si la quantité de mémoire vive est faible et que la taille totale de certaines entrées (où N est le nombre de cœurs de CPU) est énorme, il peut arriver que toute la mémoire vive disponible pour le CLR soit épuisée et que l’exception OutOfMemoryExcepton se produise.ParallelCompressionMode.Auto
: Le mode intelligent. Il estime les cœurs du CPU, la taille des entrées, la mémoire disponible et choisit de compresser les entrées en parallèle ou séquentiellement. Dans ce mode, certaines entrées plus petites seront compressées en parallèle et d’autres séquentiellement. Généralement, il est prudent de choisir cette option, Aspose.ZIP se méfie des estimations et passe à la compression séquentielle comme solution de repli. Il existe une autre propriété deParallelOptions
pour ce mode -AvailableMemorySize
( getAvailableMemorySize/ setAvailableMemorySize). Il est inutile pour tout autre mode. En gros, il s’agit de la limite supérieure de la mémoire allouée lors de la compression des entrées avec tous les cœurs du processeur, en mégaoctets. Aspose.ZIP utilise ce nombre pour estimer la plus grande taille d’entrée qui peut être compressée en parallèle en toute sécurité. Les entrées dépassant le seuil seront compressées séquentiellement. Le paramètreAvailableMemorySize
est une arme à double tranchant : s’il est réglé trop haut avec des entrées énormes, il peut entraîner l’épuisement de la mémoire vive, un échange intense, et même une exception de mémoire insuffisante. Si elle est trop basse, la plupart des entrées seront compressées de manière séquentielle sans grande accélération. Les utilisateurs avertis peuvent donc l’attribuer en tenant compte du compromis.
Nous vous encourageons à jouer avec les différents modes de compression parallèle sur vos données typiques pour déterminer quels sont les meilleurs paramètres dans votre cas.
Echantillon
1try (FileOutputStream zipFile = new FileOutputStream("archive.zip")) {
2 try (Archive 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}