Soporte multiproceso en 7za

Soporte multiproceso en 7za

(Publiqué esto primero en serverfault, pero luego me di cuenta de que probablemente pertenece aquí).

Estoy intentando comprimir un archivo de texto muy grande usando 7za (p7zip) 9.20. La opción -mmt no parece tener ningún efecto. Probé tanto -mmt=on como -mmt=2. Esta es una máquina de 8 núcleos. Una persona sugirió agregar -m0=lzma2 como argumento, pero eso solo me da E_INVALIDARG. ¿Alguien sabe cómo hacer que esto funcione?

Esto no tiene ningún efecto:

7za a -mx=9 -mmt=2 -p myarchive.zip bigfile.txt

Y esto falla con un error:

7za a -m0=lzma2 -mx=9 -mmt=2 -p myarchive.zip bigfile.txt


7-Zip (A) [64] 9.20  Copyright (c) 1999-2010 Igor Pavlov  2010-11-18
p7zip Version 9.20 (locale=en_US.UTF-8,Utf16=on,HugeFiles=on,8 CPUs)
Scanning

Creating archive release_20120601-1-http.zip



System error:
E_INVALIDARG

Respuesta1

De acuerdo a-m (Establecer método de compresión) interruptor # ZipMultiThread - manual y documentación de 7ZIP, mtel valor predeterminado es on, por lo que no es necesario especificarlo en absoluto.

Sin embargo, la implementación del algoritmo DEFLATE de 7zip no admite subprocesos múltiples.

Como ya has descubierto,

7za a archive.zip bigfile

Sólo utiliza un núcleo.

Pero .ziplos archivos comprimen cada archivo individualmente. Al comprimirvariosarchivos, la opción de subprocesos múltiples comprime un archivo por núcleo a la vez.

Pruébalo y verás que

7za a archive.zip bigfile1 ... bigfileN

utilizará todos Nlos núcleos disponibles.

Si desea acelerar la compresión de unsolteroarchivo, tienes dos opciones:

  1. Dividir bigfileen trozos.

  2. Utilice un algoritmo de compresión diferente.

    Por ejemplo, la implementación del algoritmo BZip2 de 7zip admite subprocesos múltiples.

    La sintaxis es:

    7za a -mm=BZip2 archive.zip bigfile
    

Además, el error de sintaxis se debe a su intento de utilizar el algoritmo LZM para un .zipcontenedor. Eso no es posible.

Los posibles algoritmos para .zipcontenedores son DEFLATE(64), BZip2 y sin compresión.

Si desea utilizar el algoritmo LZM, utilice un .7zcontenedor. Este contenedor también maneja los siguientes algoritmos: PPMd, BZip2, DEFLATE, BCJ, BCJ2 y sin compresión.

Respuesta2

Esta es una pregunta antigua, y no la respuesta a la pregunta específica, sino una respuesta al espíritu de la pregunta (Usar todos los núcleos para comprimir un formato zip)

pigz (gzip paralelo con opción .zip)

pigz -K -k archive.zip bigfile txt

Esto le dará un archivo compatible con zip 7 veces más rápido para el mismo nivel de compresión.

Comparaciones rápidas de compresores compatibles con zip y no zip que utilizan núcleos únicos y múltiples.

tiempos de pared en i7-2600k para comprimir archivos txt de 1.0 gb en fedora 20

67s (120mb) 7za (zip,1 thread)
15s (141mb) 7za -mx=4 (zip,1 thread)
17s (132mb) zip (zip,1 thread)
 5s (131mb) pigz -K -k (zip,8 threads)
 9s (106mb) bsc (libbsc.com) (not zip,8 threads)
 5s (130mb) zhuff -c2 (not zip,8 threads)
 2s (149mb) zhuff (not zip,8 threads)

tiempos de pared para descomprimir

4.2s unzip -t
2.0s pigz -t
5.1s bsc d
0.5s zhuff -d

Respuesta3

Otra opción para lograr una compresión multiproceso en Linux es usar lo que usa Facebook,Zestándar. En Ubuntu, lo instalas así:

sudo apt install zstd

Compresión multiproceso súper rápida:

tar cf - /folder/you/want/to/compress | zstdmt -o /location/to/output/fileName$(date '+%Y-%m-%d_%H:%M:%S').tar.zst

Puede especificar los niveles de compresión del 1 al 19 (3 ​​es el valor predeterminado).

Compresión máxima (más lenta):

tar cf - /folder/you/want/to/compress | zstdmt -19 -o /location/to/output/fileName$(date '+%Y-%m-%d_%H:%M:%S').tar.zst

Compresión media (nivel 10):

tar cf - /folder/you/want/to/compress | zstdmt -10 -o /location/to/output/fileName$(date '+%Y-%m-%d_%H:%M:%S').tar.zst

Mi experiencia general es que la compresión Zstandard no es tan fuerte como 7zip, pero es mucho más rápida y el zstdmtcomando intenta utilizar todos los núcleos.

Por cierto, en Windows, 7zip usa todos los procesadores de forma predeterminada y estoy muy decepcionado de que este no sea el caso en Linux. Ha sido así durante varios años, en este punto, y desearía que 7zip también fuera multiproceso de forma predeterminada en Linux.

Respuesta4

Solo usa -mmt[N+1]

Por ejemplo: -mmt2 es para un subproceso, -mmt9 es para ocho subprocesos

información relacionada