¿Qué herramientas de compresión están disponibles en Ubuntu que pueden beneficiarse de una CPU de múltiples núcleos?
¿Qué herramientas de compresión están disponibles en Ubuntu que pueden beneficiarse de una CPU de múltiples núcleos?
Respuestas:
Hay dos herramientas principales. lbzip2
y pbzip2
. Son implementaciones esencialmente diferentes de los compresores bzip2. Los he comparado (el resultado es una versión ordenada, pero debería poder ejecutar los comandos)
cd /dev/shm # we do all of this in RAM!
dd if=/dev/urandom of=bigfile bs=1024 count=102400
$ lbzip2 -zk bigfile
Time: 0m3.596s
Size: 105335428
$ pbzip2 -zk bigfile
Time: 0m5.738s6
Size: 10532460
lbzip2
parece ser el ganador en datos aleatorios. Está un poco menos comprimido pero mucho más rápido. YMMV.
/dev/urandom
No es una gran opción de entrada para las herramientas de compresión de evaluación comparativa, ya que los datos aleatorios son, por definición, incompresibles. Eso explica en parte por qué en ambos casos el archivo de salida es ~ 450MiB más grande que la entrada.
00000000000000000000000000000000
. Así es como funciona el azar;) De lo que estás hablando es de promedios prácticos. Es poco probable que genere un archivo de 100 MB de ceros. Y estoy de acuerdo con el espíritu de lo que estás diciendo, simplemente no estoy de acuerdo con "por definición" porque esa no es la definición (porque es inexacta).
wget http://mattmahoney.net/dc/enwik8.zip
para obtener 96MB (21MB comprimido) de texto de Wikipedia. Para obtener un conjunto de puntos de referencia mucho más completo, consulte aquí .
Bueno, la palabra clave era paralela . Después de buscar todas las herramientas de compresión que también eran paralelas , encontré lo siguiente:
PXZ : Parallel XZ es una utilidad de compresión que aprovecha la ejecución de la compresión LZMA de diferentes partes de un archivo de entrada en múltiples núcleos y procesadores simultáneamente. Su objetivo principal es utilizar todos los recursos para acelerar el tiempo de compresión con la mínima influencia posible en la relación de compresión.
sudo apt-get install pxz
PLZIP : Lzip es un compresor de datos sin pérdidas basado en el algoritmo LZMA, con una comprobación de integridad muy segura y una interfaz de usuario similar a la de gzip o bzip2. Lzip descomprime casi tan rápido como gzip y comprime mejor que bzip2, lo que lo hace muy adecuado para la distribución de software y el archivo de datos.
Plzip es una versión masivamente paralela (multiproceso) de lzip que utiliza el formato de archivo lzip; los archivos producidos por plzip son totalmente compatibles con lzip.
Plzip está diseñado para una compresión / descompresión más rápida de archivos grandes en máquinas multiprocesador, lo que lo hace especialmente adecuado para la distribución de archivos de software grandes y el archivo de datos a gran escala. En archivos lo suficientemente grandes, plzip puede usar cientos de procesadores.
sudo apt-get install plzip
PIGZ - pigz, que significa Implementación Paralela de GZip, es un reemplazo completamente funcional para gzip que aprovecha múltiples procesadores y múltiples núcleos al comprimir datos.
sudo apt-get install pigz
PBZIP2 - pbzip2 es una implementación paralela del compresor de archivos de clasificación de bloques bzip2 que usa pthreads y logra una aceleración casi lineal en máquinas SMP. El resultado de esta versión es totalmente compatible con bzip2 v1.0.2 (es decir: cualquier cosa comprimida con pbzip2 puede descomprimirse con bzip2).
sudo apt-get install pbzip2
LRZIP : un programa de compresión multiproceso que puede lograr relaciones y velocidades de compresión muy altas cuando se usa con archivos grandes. Utiliza los algoritmos de compresión combinados de zpaq y lzma para una compresión máxima, lzo para la velocidad máxima y la reducción de redundancia de largo alcance de rzip. Está diseñado para escalar con aumentos con el tamaño de RAM, mejorando aún más la compresión. Una opción de optimización de tamaño o velocidad permite una mejor compresión de la que incluso puede proporcionar lzma, o una mejor velocidad que gzip, pero con niveles de compresión de tamaño bzip2.
sudo apt-get install lrzip
Una pequeña referencia de compresión (utilizando la prueba que creó Oli):
TAMAÑO DE ARCHIVO ORIGINAL - 100 MB
PBZIP2 - 101 MB (1% más grande)
PXZ - 101 MB (1% más grande)
PLZIP - 102 MB (1% más grande)
LRZIP - 101 MB (1% más grande)
PIGZ - 101 MB (1% más grande) )
Una pequeña referencia de compresión (usando un archivo de texto):
TAMAÑO DE ARCHIVO ORIGINAL - 70 KB Archivo de texto
PBZIP2 - 16.1 KB (23%)
PXZ - 15.4 KB (22%)
PLZIP - 15.5 KB (22.1%)
LRZIP - 15.3 KB (21.8%)
PIGZ - 17.4 KB (24.8%)
lrzip
se puede descomprimir usando pbzip2
, por ejemplo.
Además del bonito resumen anterior (gracias Luis), en estos días la gente también podría querer considerar PIXZ, que según README (Fuente: https://github.com/vasi/pixz , no he verificado las afirmaciones por mí mismo ) tiene algunas ventajas sobre PXZ.
[Compared to PIXZ, PXZ has these advantages and disadvantages:]
* Simpler code
* Uses OpenMP instead of pthreads
* Uses streams instead of blocks, not indexable
* Uses temp files and doesn't combine them until the whole file is compressed, high disk/memory usage
En otras palabras, PIXZ supuestamente es más eficiente en memoria y disco, y tiene una función de indexación opcional que acelera la descompresión de componentes individuales de archivos tar comprimidos.
pixz
archivos no son compatibles con el xz
formato estándar , como pxz
sería.
pixz
puede descomprimir xz
archivos y xz
puede descomprimir pixz
archivos. Sin embargo, las opciones de línea de comando en xz
y pixz
difieren.
pixz
.
XZ Utils admite la compresión multiproceso desde la versión 5.2.0, originalmente se documentó erróneamente como descompresión multiproceso.
Por ejemplo: tar -cf - source | xz --threads=0 > destination.tar.xz
export XZ_DEFAULTS="-T 0"
y luego simplemente usar su llamada tar habitual, es decir tar cJf target.tar.xz source
.
lzop también puede ser una opción viable, aunque es de un solo subproceso.
Utiliza el muy rápido algoritmo de compresión lempel-ziv-oberhumer que es 5-6 veces más rápido que gzip en mi observación.
Nota: Aunque todavía no es multiproceso, probablemente superará a pigz en sistemas de 1-4 núcleos. Es por eso que decidí publicar esto incluso si no responde directamente a su pregunta. Pruébelo, puede resolver su problema de cuello de botella de CPU mientras usa solo una CPU y comprime un poco peor. A menudo me pareció una mejor solución que, por ejemplo, pigz.
El compresor LZMA2 de p7zip usa ambos núcleos en mi sistema.
En realidad no es una respuesta, pero creo que es lo suficientemente relevante para compartir mis puntos de referencia que comparan la velocidad de gzip
y pigz
en una verdadera HW en un escenario de la vida real. Como pigz
es la evolución multiproceso que personalmente he elegido usar de ahora en adelante.
Metadatos
Intel(R) Core(TM) i7-7700HQ CPU @ 2.80GHz
(4c / 8t) + SSD NvmeXubuntu 17.10 (artful)
gzip
versión: 1.6
pigz
versión: 2.4
gzip
rápido
time gzip -1kN ./db_dump.sql
real 1m22,271s
user 1m17,738s
sys 0m3,330s
gzip
mejor
time gzip -9kN ./db_dump.sql
real 10m6,709s
user 10m2,710s
sys 0m3,828s
pigz
rápido
time pigz -1kMN ./db_dump.sql
real 0m26,610s
user 1m55,389s
sys 0m6,175s
pigz
mejor (no zopfli
)
time pigz -9kMN ./db_dump.sql
real 1m54,383s
user 14m30,435s
sys 0m5,562s
pigz
+ zopfli
algoritmo
time pigz -11kMN ./db_dump.sql
real 171m33,501s
user 1321m36,144s
sys 0m29,780s
Como resultado final, no recomendaría el zopfli
algoritmo ya que la compresión tomó una gran cantidad de tiempo para ahorrar una cantidad no significativa de espacio en disco.
Tamaños de archivo resultantes:
Zstandard admite subprocesos múltiples desde v1.2.0 ¹. Es un compresor y descompresor muy rápido destinado a reemplazar gzip y también puede comprimir de manera tan eficiente, si no mejor, como LZMA2 / XZ en sus niveles más altos.
Debe utilizar una versión ingeniosa o más reciente, o compilar la última versión de la fuente para obtener estos beneficios. Afortunadamente, no atrae muchas dependencias.