Soporte multiproceso en 7za

18

(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. He intentado 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 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
Brian L
fuente
Creo que la opción es simplemente -mmt, no -mmt=2. También creo que la sintaxis adecuada es -mx9, aunque ambas podrían funcionar.
Avance el
Gracias, pero -mmt sin una opción todavía usa solo un hilo. De acuerdo con docs.bugaco.com/7zip/MANUAL/switches/method.htm#ZipMultiThread , puede especificar el número de subprocesos que se utilizarán, -mmt = N.
Brian L
Todavía recomendaría usar LZMA / Deflate aunque solo sea de un solo subproceso. Si bien puede obtener una mayor velocidad de compresión con BZip2, es menos eficiente al comprimir texto sin formato, y las variantes de subproceso único son más lentas que los equivalentes LZMA / Deflate.
Avance el
@Breakthrough: BZip2 generalmente logra una mejor compresión que DEFLATE, como se muestra en su enlace. También es mucho, mucho más rápido que LZMA (cuando se comprime).
Dennis

Respuestas:

25

De acuerdo con el modificador -m (Establecer método de compresión) # ZipMultiThread - 7ZIP manual y documentación , el valor mtpredeterminado es on, por lo que no hay necesidad de especificarlo.

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

Como ya has descubierto,

7za a archive.zip bigfile

solo usa un núcleo.

Pero los .ziparchivos comprimen cada archivo individualmente. Al comprimir varios archivos, 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 los Nnúcleos disponibles .

Si desea acelerar la compresión de un solo archivo, tiene dos opciones:

  1. Dividido bigfileen trozos.

  2. Use un algoritmo de compresión diferente.

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

    La sintaxis es:

    7za a -mm=BZip2 archive.zip bigfile
    

Además, el error de sintaxis es causado por su intento de usar el Algoritmo LZM para un .zipcontenedor. Eso no es posible.

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

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

Dennis
fuente
@ Dennis Pensé que el OP estaba usando LZMA (2), que según la documentación, "la compresión LZMA usa solo 2 hilos". Aunque estoy de acuerdo, intuitivamente (debido a la forma en que funciona la codificación Lempel-Ziv ), sería muy difícil multiprocesar LZMA o Deflate (que es solo LZMA con codificación Huffman).
Avance el
1
@Breakthrough: Al principio, yo también (mira las revisiones de mi respuesta). De eso se trataba el error de sintaxis. No puede usar la compresión LZMA con un .zipcontenedor.
Dennis
@ Dennis ah, gracias por aclarar eso. No vi que el OP estaba usando un .ZIPcontenedor.
Avance el
Espera, ¿obtendré un resultado diferente si solo cambio la extensión del archivo del contenedor a .7z?
Brian L
3
@BrianL hay un botón de "gracias" incorporado. Parece una flecha hacia arriba;)
nhinkle
5

Esta es una pregunta antigua, y no la respuesta a la pregunta específica, sino una respuesta al espíritu de la pregunta (Uso de 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 zip compatible 7 veces más rápido para el mismo nivel de compresión.

Una comparación rápida de compresores compatibles con zip y no zip que utilizan núcleos únicos y múltiples.

tiempos de pared en i7-2600k para comprimir el archivo 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
tgeorge
fuente
¿Por qué pigz cuando puedes pbzip2 o pixz?
asiente con la cabeza el
gzip es mucho, mucho más rápido que bzip2, por lo que la compresión adicional no siempre vale la pena.
jesjimher
0

Solo use -mmt [N + 1]

Por ejemplo: -mmt2 es para un hilo, -mmt9 es para ocho hilos

acubado
fuente
-1

Verificado y probado: para usar el subprocesamiento múltiple en 7za, el parámetro debe ser "-mmt #" no "-mmt = #", al poner el signo igual se ignora.

¿Cómo lo había descubierto? Después de ejecutar 7z sin ningún parámetro, muestra la información sobre los parámetros, en los interruptores dice "-mmt [N]", no "-mmt = [N]"

Entonces, si entiendo bien, el parámetro que está escribiendo "-mmt = 2" puede estar mal escrito y puede ser "-mmt2", sin el signo igual.

No estoy seguro si entiendo bien, mi inglés es realmente pobre.

Por cierto, ¿por qué usas "7za" en lugar de solo "7z"?

Entonces, para probar el parámetro, ejecuto un conjunto de comandos para hacer puntos de referencia y eso confirmó el error tipográfico en alguna documentación. El parámetro correcto debe escribirse sin el signo igual.

Comando para hacer un punto de referencia con 7z con solo un hilo: 7z b -mmt1

Comando para hacer un punto de referencia con 7z con solo dos hilos: 7z b -mmt2

Comando para hacer un punto de referencia con 7za con solo dos hilos: 7za b -mmt2

Comando para hacer un punto de referencia con 7za con solo un hilo: 7za b -mmt1

No hay un signo igual en el parámetro ˋ-mmt # ˋ, ni para 7z ni para 7za.

Laura
fuente