
(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, mt
el 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 .zip
los 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 N
los núcleos disponibles.
Si desea acelerar la compresión de unsolteroarchivo, tienes dos opciones:
Dividir
bigfile
en trozos.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 .zip
contenedor. Eso no es posible.
Los posibles algoritmos para .zip
contenedores son DEFLATE(64), BZip2 y sin compresión.
Si desea utilizar el algoritmo LZM, utilice un .7z
contenedor. 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 zstdmt
comando 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