Composición paralela de Archivos ZIP
Descripción general
La API Aspose.ZIP proporciona la capacidad de 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 multiproceso: explicación
Utilice ParallelOptions para indicar que el archivo debe prepararse con varios núcleos de CPU.
Configurar ParallelCompressInMemory indica la estrategia que elegimos para realizar múltiples tareas. Aquí hay tres opciones:
ParallelCompressionMode.Never
: la compresión de todas las entradas es secuencial. Sólo un núcleo de CPU funciona con compresión y vacía los datos comprimidos a medida que llegan.ParallelCompressionMode.Always
: fuerza la compresión de entradas en diferentes subprocesos independientemente del tamaño de la entrada, la memoria disponible y otros factores. Cada núcleo de la CPU comprime simultáneamente un archivo manteniendo sus datos comprimidos en la RAM. Una vez que se comprime 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 la cantidad de núcleos de CPU) es enorme, puede suceder que toda la RAM disponible para CLR se agote y surja OutOfMemoryExcepton.ParallelCompressionMode.Auto
: El modo inteligente. Estima los núcleos de CPU, los tamaños de las entradas, la memoria disponible y elige si comprimir las entradas en paralelo o secuencialmente. En este modo, algunas entradas más pequeñas se comprimen en paralelo y otras de forma secuencial. Las entradas LZMA no se comprimen en paralelo debido al alto consumo de memoria. Generalmente, es seguro optar por esta opción, Aspose.ZIP desconfía de las estimaciones y cambia a la compresión secuencial como alternativa. Hay una propiedad más de ParallelOptions para este modo: AvailableMemorySize. No tiene sentido para ningún otro modo. En términos generales, es el límite superior de memoria asignada al comprimir entradas con todos los núcleos de CPU, en megabytes. Aspose.ZIP usa ese número para estimar el tamaño más grande de entrada que es seguro comprimir en paralelo. Las entradas por encima del umbral se comprimirán secuencialmente. DisponibleMemorySize es un arma de doble filo: si se establece demasiado alto con entradas grandes, puede producir agotamiento de la RAM, intercambio intenso e incluso podría ser 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 teniendo en cuenta las compensaciones.
Le recomendamos que juegue con diferentes modos de compresión paralela en sus datos típicos para determinar cuál es la mejor configuración en su caso.
Cómo crear un archivo ZIP con compresión paralela en un ejemplo de C#
Pasos: Crear un archivo ZIP con compresión paralela en C#
- Abra una secuencia de archivos (
FileStream
) enFileMode.Create
para crear un nuevo archivo ZIP (archive.zip
). - Inicialice un nuevo objeto “Archivo” para administrar entradas ZIP.
- Utilice el método
CreateEntry
para agregar varias entradas, como “first.bin
” y “last.bin
”, usandoFile.OpenRead
para leer de los archivos fuente (data1.bin
ydatosN.bin
). - Configure
ArchiveSaveOptions
conParallelOptions
, dondeParallelCompressInMemory
está configurado enParallelCompressionMode.Always
, lo que permite la compresión paralela para un archivado más rápido. - Guarde el archivo con las opciones especificadas utilizando el método “Guardar”.
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 }