Disminuyendo el tiempo que toma comprimir un archivo en Linux

Bueno, seguramente todos los que andamos en el mundo de Linux conocemos bien al comando gzip.
Este comando hace algo muy importante y simple: comprime la información contenida en un archivo.
Realmente las tasas de compresión de gzip son buenas, tan buenas que es el compresor al momento por excelencia en nuestro mundo de Linux. Casi todas las aplicaciones se comprimen por gzip, por más que hayan programas que compriman más en términos de tamaño o que compriman más rápido.

Hablando de rapidez, descubrí un día que el comando gzip usa solamente un procesador, lanza un sólo hilo para realizar la compresión, a pesar de que tu equipo tenga 2, 4, 8, 16 procesadores, o lo que sea, gzip hace uso de uno sólo.

Esto no es eficiente, si tengo un equipo con 4 procesadores por ejemplo, mejor fuera que se lanzaran 4 hilos de este programa y que el proceso de compresión fuera más rápido ya que normalmente es demorado por su necesidad de encontrar cadenas similares para comprimir.

Para esto, existe una alternativa 100% compatible con gzip, se llama “pigz”, es un paquete que puedes instalar con yum install pigz

Luego de instalado, simplemente en vez de utilizar gzip para comprimir, uso pigz, es un drop in, es decir, puedo simplemente sustituir “gzip” por “pigz” y lograr la compresión.

Por ejemplo si quiero hacer un tar podría usar:
tar cf – /etc | gzip -c -> etc.tar.gz

Esto comprimirá como siempre se ha hecho, con gzip. Con un sólo hilo, y por tanto como siempre le hemos visto de rápido o lento.

Ahora, lo mismo lo quiero hacer con pigz? así:
tar cf – /etc | pigz -c -> etc.tar.gz

y ya… pigz determinará cuántos procesadores tienes y lanzará tantos hilos de pigz como procesadores tengas, y el proceso será mucho más rápido, te lo prometo.

Aquí un ejemplo, esto es hecho en mi laptop que tiene 2 procesadores:

eperez@eperez ~$ ls -lh t
-rw-rw-r–. 1 eperez eperez 17M Jun 10 20:52 t

Como puedes ver el archivo t tiene 17M de tamaño, vamos a comprimirlo con gzip y medir cuánto demoró.
eperez@eperez ~$ time gzip -c t > t.gzip

real 0m9.533s
user 0m9.339s
sys 0m0.060s

Ahora vamos a hacer lo mismo con pigz:
eperez@eperez ~$ time pigz -c t > t.pigz

real 0m5.064s
user 0m9.416s
sys 0m0.119s

te fijas, tomó 9.5 segundos comprimir los 17MB usando el gzip y tomó 5segundos comprimir los 17MB usando pigz (sin embargo el tiempo de usuario fue muy similar).

pigz hizo uso de los dos procesadores, el tiempo se dividió entre ambos.. y gzip sólo usó uno…

Lógico, si tienes más procesadores puedes notar que los tiempos bajan bastante..

suerte y dale uso!

Leave a Reply

Your email address will not be published. Required fields are marked *

This site uses Akismet to reduce spam. Learn how your comment data is processed.