Una alternativa less hambrienta de resources para conectar `cat` a gzip para files enormes

Tengo algunos files de los cuales algunos son muy grandes (como varios GB), que necesito concatenar a un file grande y luego comprimirlo, así que algo como esto:

cat file1 file2 file3 file4 | gzip > compress.gz 

que produce una carga extremadamente alta de CPU y memory en la máquina o incluso la hace colisionar, porque el cat genera varios GB.

No puedo usar files tar, realmente necesito un gran fragment comprimido por gzip.

¿Cómo puedo producir el mismo file gz de forma secuencial, para que no tenga que cat varios GB primero, pero todavía tengo todos los files en el mismo .gz al final?

cat no utiliza ningún time de CPU significativo (a less que tal vez se trate de desencryption o descompression en el disco y se tenga en count en el process cat , que es el que se lee del disco) o en la memory. Simplemente lee el contenido de los files y lo escribe en el tubo en pequeños fragments en un bucle.

Sin embargo, aquí, no lo necesitas. Puedes hacer:

 gzip -c file1 file2 file3 file4 > compress.gz 

(No es que suponga una gran diferencia).

Puede disminuir la prioridad del process gzip (progtwigción de la CPU wrt) con el nice command. Algunos sistemas tienen un command ionice para lo mismo con E / S.

 nice -n 19 ionice -c idle pigz -c file1 file2 file3 file4 > compress.gz 

En Linux correría una versión paralela de gzip con el menor impacto posible en el sistema.

Tener compress.gz en un disco diferente (si usa almacenamiento rotativo) lo haría más eficiente.

El sistema puede almacenar en caching los datos que cat o gzip/pigz leen en la memory si tiene memory disponible para hacerlo. Lo hace en caso de que necesite esos datos de nuevo. En el process, puede desalojar otros datos en caching que sean más útiles. Aquí, es probable que los datos no necesiten estar disponibles.

Con GNU dd , puede usar iflag=nocache para avisarle al sistema que no iflag=nocache en caching los datos:

 for file in file1 file2 file3 file4; do ionice -c idle dd bs=128k status=none iflag=nocache < "$file" done | nice pigz > compress.gz 

Si desea estirar el process sin utilizar demasiados resources, intente modificar la prioridad de progtwigción cambiando el valor nice .:

 nice -n 19 cat file1 file2 file3 file4 | gzip > compress.gz 

hombre agradable

  -n, --adjustment=N add integer N to the niceness (default 10) 

También puedes regular la velocidad de gzip que puede valer la pena investigar ( --best )

Hay otros methods disponibles, pero mantendrán los files separados:

Si está contento de utilizar el formatting de file tar , entonces puede usar el argumento zip para comprimir el contenido sobre la marcha, sin embargo, esto puede mantener el procesamiento alto:

 tar zcvf compress.tgz file[1234] 

O puede usar zip que puede tratar con múltiples files:

 zip compress.zip file[1234]