Me encuentro teniendo que comprimir una cantidad de archivos muy grandes (80-GB GB), y me sorprende la (falta de) velocidad que exhibe mi sistema. Obtengo aproximadamente 500 MB / min de velocidad de conversión; usando top
, parece que estoy usando una sola CPU al 100% aproximadamente.
Estoy bastante seguro de que no es (solo) la velocidad de acceso al disco, ya que crear un tar
archivo (así fue como se creó el archivo 80G) tomó solo unos minutos (tal vez 5 o 10), pero después de más de 2 horas mi simple comando gzip sigue siendo no hecho
En resumen:
tar -cvf myStuff.tar myDir/*
Tomó <5 minutos para crear un archivo tar 87 G
gzip myStuff.tar
Tomó dos horas y 10 minutos, creando un archivo zip 55G.
Mi pregunta: ¿es esto normal? ¿Hay ciertas opciones gzip
para acelerar las cosas? ¿Sería más rápido concatenar los comandos y usarlos tar -cvfz
? Yo referencia a la sierra pigz
- aplicación paralela de GZip - pero por desgracia no puedo instalar el software en la máquina que estoy utilizando, por lo que no es una opción para mí. Ver por ejemplo esta pregunta anterior .
Tengo la intención de probar algunas de estas opciones yo mismo y cronometrarlas, pero es muy probable que no llegue a "la combinación mágica" de opciones. Espero que alguien en este sitio conozca el truco correcto para acelerar las cosas.
Cuando tenga los resultados de otras pruebas disponibles, actualizaré esta pregunta, pero si alguien tiene un truco particularmente bueno disponible, realmente lo agradecería. Tal vez el gzip solo requiere más tiempo de procesamiento del que me di cuenta ...
ACTUALIZAR
Como prometí, probé los trucos que se sugieren a continuación: cambiar la cantidad de compresión y cambiar el destino del archivo. Obtuve los siguientes resultados para un alquitrán de aproximadamente 4.1 GB:
flag user system size sameDisk
-1 189.77s 13.64s 2.786G +7.2s
-2 197.20s 12.88s 2.776G +3.4s
-3 207.03s 10.49s 2.739G +1.2s
-4 223.28s 13.73s 2.735G +0.9s
-5 237.79s 9.28s 2.704G -0.4s
-6 271.69s 14.56s 2.700G +1.4s
-7 307.70s 10.97s 2.699G +0.9s
-8 528.66s 10.51s 2.698G -6.3s
-9 722.61s 12.24s 2.698G -4.0s
Entonces, sí, cambiar la bandera de la predeterminada -6
a la más rápida -1
me da una aceleración del 30%, con (para mis datos) casi ningún cambio en el tamaño del archivo zip. Si estoy usando el mismo disco u otro, esencialmente no hace ninguna diferencia (tendría que ejecutar esto varias veces para obtener alguna significación estadística).
Si alguien está interesado, generé estos puntos de referencia de tiempo utilizando los siguientes dos scripts:
#!/bin/bash
# compare compression speeds with different options
sameDisk='./'
otherDisk='/tmp/'
sourceDir='/dirToCompress'
logFile='./timerOutput'
rm $logFile
for i in {1..9}
do /usr/bin/time -a --output=timerOutput ./compressWith $sourceDir $i $sameDisk $logFile
do /usr/bin/time -a --output=timerOutput ./compressWith $sourceDir $i $otherDisk $logFile
done
Y el segundo script ( compressWith
):
#!/bin/bash
# use: compressWith sourceDir compressionFlag destinationDisk logFile
echo "compressing $1 to $3 with setting $2" >> $4
tar -c $1 | gzip -$2 > $3test-$2.tar.gz
Tres cosas a tener en cuenta:
- Usar en
/usr/bin/time
lugar detime
, ya que el comando incorporado debash
tiene muchas menos opciones que el comando GNU - No me molesté en usar la
--format
opción, aunque eso facilitaría la lectura del archivo de registro - Utilicé un script en un script ya que
time
parecía funcionar solo con el primer comando en una secuencia canalizada (por lo que lo hice ver como un solo comando ...).
Con todo esto aprendido, mis conclusiones son
- Acelera las cosas con la
-1
bandera (respuesta aceptada) - Se gasta mucho más tiempo comprimiendo los datos que leyendo desde el disco
- Invierta en un software de compresión más rápido (
pigz
parece una buena opción). - Si tiene varios archivos para comprimir, puede colocar cada
gzip
comando en su propio hilo y usar más de la CPU disponible (pobrepigz
)
¡Gracias a todos los que me ayudaron a aprender todo esto!
$> gzip -c myStuff.tar | pv -r -b > myStuff.tar.gz
le mostrará qué tan rápido su máquina está comprimiendo las cosas. nota lateral2: almacena el resultado en un disco diferente.
man
página, y no leí tan lejos (porque está ordenada por 'comando de letra única', que es -#
) . ¡Eso me enseñará a RTFM! ¡Esto será lo próximo que intentaré!
pigz
y ejecutarlo desde cualquier lugar donde lo haya compilado , sin instalarlo. Si no hay un compilador, puede realizar una compilación cruzada en otra computadora, aunque eso está comenzando a requerir más esfuerzo del que podría valer la pena. (Dependiendo de cuánto necesita esta compresión para correr más rápido, supongo).