/

Comprimir con gzip usando multiples nucleos

Created 2020-02-08 Modifyed 2020-02-08
557 Words

Aquí vamos a tratar que opciones tenemos para hacerlo en linux.

Por un lado podemos empaquetarlos sin comprimirlos, esto lo haremos con

tar -cf archivoDestino.tar directorioAEmpaquetar

De esta forma todos nuestros archivos quedaran en un único archivo que luego podremos desempaquetar con

tar -xf archivoDestino.tar

Pero hay veces que necesitamos comprimir los archivos además de empaquetarlos, esto podemos hacerlo pasandole al comando tar un flag. Por ejemplo podemos pasarle la “z” y esto hará que se comprima con gzip. El comando quedaría así:

tar -zcf archivoDestino.tar.gzip directorioAEmpaquetar

y para desempaquetarlo y descomprimirlo lo haríamos así:

tar -zxf archivoDestino.tar

Esto está muy bien, pero si comprimimos un directorio con mucho contenido, podremos ver que no estamos utilizando todos los nucleos disponibles de nuestro cpu. Con lo que la compresión de un directorio con muchos GB tarda bastante, y no solo eso, sino que en realidad no estamos aprovechando ese pedazo cpu que nos compramos y que nos costó un dineral. Lo podemos comprobar en la siguiente imagen.

comprimir-con-gzip-usando-multiples-nucleos-1

La solución para utilizar nuestro cpu al 100% es utilizar tar y mediante un pipe pasárselo a pigz. Este comando tiene varias opciones que os recomiendo reviseis.

Mira la siguiente imagen y veremos que todo nuestro cpu está trabajando.

comprimir-con-gzip-usando-multiples-nucleos-2

Ahora, vamos ha hacer un benchmark comparando el primer metodo de compresión (un núcleo) y el otro (multinúcleo). Para esta prueba vamos a usar el siguiente hardware:

CPU Intel(R) Core(TM) i7-4790K CPU @ 4.00GHz

RAM 20GB de memoria ram.

HD origen SAMSUNG SSD PM830 2.5” 7mm 128GB

HD destino SAMSUNG SSD 850 EVO 500GB

Vamos a comprimir un directorio que ocupa 33GB, ejecutaremos el siguiente comando:

du -hs Programas/ && date && tar -zcf Programas.un.nucleo.tar.gz Programas/ && date

comprimir-con-gzip-usando-multiples-nucleos-3

Como podemos ver en la imagen anterior, la compresión típica con tar -zcvf ha tardado 18 minutos mas o menos. Ahora haremos la prueba usando pigz y de esta manera usar todos los núcleos.

du -hs ../benchmark/Programas/ && date && tar cf - ../benchmark/Programas | pigz > /mnt/benchmark/Programas.multi.nucleo.tar.gz && date

comprimir-con-gzip-usando-multiples-nucleos-4

Como podemos ver, esta vez la compresión no ha llegado a 6 minutos, con lo que la mejora es considerable.

Si quieres comprimir rápido y no te quieres volver loco con los comandos, puedes descargar el script que he creado y utilizarlo.

Para ello puedes hacerlo aquí:

https://github.com/athos54/tarGzipMultiCore

O tambien puedes descargarlo así:

sudo curl https://raw.githubusercontent.com/athos54/tarGzipMultiCore/master/tarGzipMultiCore --output /usr/local/bin/tarGzipMultiCore && sudo chmod +x /usr/local/bin/tarGzipMultiCore

y luego usarlo así

tarGzipMultiCore originFolderPath destinyFile.tar.gz