Composición paralela de archivos ZIP
**Descripción general
La API de Aspose.ZIP permite componer archivos ZIP. Debido a que las entradas de dicho archivo se pueden comprimir de forma independiente, es posible paralelizar la creación de archivos hasta cierto punto.
ZIP multihilo: explicación
Utilice ParallelOptions para indicar que el archivo debe prepararse con varios núcleos de CPU.
Establecer ParallelCompressInMemory
(
getParallelCompressInMemory/
setParallelCompressInMemory) indica la estrategia que elegimos para la multitarea.
Aquí hay tres opciones:
ParallelCompressionMode.Never
: la compresión de todas las entradas es secuencial. Sólo un núcleo de la CPU trabaja en la compresión y vacía los datos comprimidos a medida que llegan.ParallelCompressionMode.Always
: Fuerza la compresión de las entradas en diferentes hilos independientemente del tamaño de la entrada, la memoria disponible y otros factores. Cada núcleo de la CPU comprime simultáneamente un fichero manteniendo sus datos comprimidos en la RAM. Una vez comprimida la entrada, se descarga en el flujo de resultados. Si su cantidad de RAM es pequeña y el tamaño total de algunas N entradas (donde N es el número de núcleos de CPU) es enorme puede ocurrir que toda la RAM disponible para CLR se agote y surja OutOfMemoryExcepton.ParallelCompressionMode.Auto
: El modo inteligente. Estima los núcleos de la CPU, el tamaño de las entradas, la memoria disponible y elige si comprimir las entradas en paralelo o secuencialmente. En este modo, algunas entradas pequeñas se comprimen en paralelo, mientras que otras se comprimen secuencialmente. Generalmente, es seguro utilizar esta opción, Aspose.ZIP es cauteloso con las estimaciones y cambia a la compresión secuencial como alternativa. Hay una propiedad más de
ParallelOptionspara este modo -
AvailableMemorySize([getAvailableMemorySize](4)/[setAvailableMemorySize](5)). Es inútil para cualquier otro modo. A grandes rasgos, es el límite máximo de memoria asignada mientras se comprimen entradas con todos los núcleos de la CPU, en megabytes. Aspose.ZIP utiliza ese número para estimar el mayor tamaño de entrada que es seguro comprimir en paralelo. Las entradas por encima del umbral se comprimirán secuencialmente. El
AvailableMemorySize` es un arma de doble filo: si se fija demasiado alto con entradas enormes, puede producir agotamiento de RAM, swap intenso, e incluso podría producirse una excepción de falta de memoria. Si se establece demasiado bajo, la mayoría de las entradas se comprimirán de forma secuencial sin mucha aceleración. Por lo tanto, los usuarios sofisticados pueden asignarlo considerando un compromiso.
Le animamos a jugar con diferentes modos de compresión paralela en sus datos típicos para determinar cuál es la mejor configuración en su caso.
**Ejemplo
1try (FileOutputStream zipFile = new FileOutputStream("archivo.zip")) {
2 try (Archive archive = new Archive()) {
3 archive.createEntry("primer.bin", "datos1.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}