Composition parallèle des archives ZIP
Aperçu
L’API Aspose.ZIP offre la possibilité de composer des archives ZIP. Étant donné que les entrées d’une telle archive peuvent être compressées indépendamment, il est possible de paralléliser la création d’archives dans une certaine mesure.
ZIP multithread : explication
Utilisez ParallelOptions pour indiquer que l’archive doit être préparée avec plusieurs cœurs de processeur.
Le paramètre ParallelCompressInMemory indique la stratégie que nous choisissons pour effectuer plusieurs tâches. Voici trois options :
ParallelCompressionMode.Never
: la compression de toutes les entrées est séquentielle. Un seul cœur de processeur fonctionne sur la compression et vide les données compressées au fur et à mesure.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 processeur compresse simultanément un fichier en conservant ses données compressées dans la RAM. Une fois l’entrée compressée, elle est envoyée dans le flux de résultats. Si votre quantité de RAM est petite et que la taille totale de certaines N entrées (où N est le nombre de cœurs de processeur) est énorme, il peut arriver que toute la RAM disponible pour le CLR s’épuise et qu’un OutOfMemoryExcepton se produise.ParallelCompressionMode.Auto
: Le mode intelligent. Il estime les cœurs de processeur, 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 doivent être compressées en parallèle tandis que d’autres de manière séquentielle. Les entrées LZMA ne sont pas compressées en parallèle en raison d’une consommation de mémoire élevée. Généralement, il est prudent d’opter pour cette option, Aspose.ZIP se méfie des estimations et passe à la compression séquentielle comme solution de repli. Il existe une propriété supplémentaire de ParallelOptions pour ce mode - AvailableMemorySize. Cela ne sert à rien 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 de processeur, en mégaoctets. Aspose.ZIP utilise ce nombre pour estimer la plus grande taille d’entrée qui peut être compressée en toute sécurité en parallèle. Entrées au-dessus du seuil à compresser séquentiellement. AvailableMemorySize est une arme à double tranchant : étant réglé trop haut avec des entrées énormes, il peut produire un épuisement de la RAM, un échange intense et même une exception de mémoire insuffisante. Étant réglé trop bas, la plupart des entrées seront compressées de manière séquentielle sans grande accélération. Ainsi, les utilisateurs avertis peuvent l’attribuer en tenant compte d’un compromis.
Nous vous encourageons à jouer avec différents modes de compression parallèle sur vos données typiques pour déterminer quels sont les meilleurs paramètres dans votre cas.
Comment créer une archive ZIP avec compression parallèle dans un exemple C#
Étapes : Créer une archive ZIP avec compression parallèle en C#
- Ouvrez un flux de fichiers (
FileStream
) dansFileMode.Create
pour créer un nouveau fichier ZIP (archive.zip
). - Initialisez un nouvel objet
Archive
pour gérer les entrées ZIP. - Utilisez la méthode
CreateEntry
pour ajouter plusieurs entrées, telles que “first.bin
” et “last.bin
”, en utilisantFile.OpenRead
pour lire à partir des fichiers source (data1.bin
etdataN.bin
). - Configurez « ArchiveSaveOptions » avec « ParallelOptions », où « ParallelCompressInMemory » est défini sur « ParallelCompressionMode.Always », permettant une compression parallèle pour un archivage plus rapide.
- Enregistrez l’archive avec les options spécifiées en utilisant la méthode
Save
.
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 }