Tengo un montón de archivos gzip que tengo que convertir a bzip2 de vez en cuando. Actualmente, estoy usando un script de shell que simplemente 'gunzip es cada archivo y luego' bzip2 es. Aunque esto funciona, lleva mucho tiempo completarlo.
¿Es posible hacer este proceso más eficiente? Estoy listo para sumergirme y mirar los códigos fuente de gunzip y bzip2 si es necesario, pero solo quiero estar seguro de la recompensa. ¿Hay alguna esperanza de mejorar la eficiencia del proceso?
fuente
pbzip2
mención En caso de que el enlace no se cargue para nadie más, aquí está la página del proyecto y la página del manual .En lugar de gunzip en un paso y bzip2 en otro, me pregunto si tal vez sería más eficiente usar tuberías. Algo como
gunzip --to-stdout foo.gz | bzip2 > foo.bz2
Estoy pensando con dos o más CPU, esto definitivamente sería más rápido. Pero tal vez incluso con un solo núcleo. Sin embargo, admito vergonzosamente no haber probado esto.
fuente
bzip2
ygzip
no funcionan en paralelo internamente, al usar una tubería puede hacer que funcionen en paralelo, porque una tubería inicia implícitamente dos procesos, que se ejecutarán en paralelo. Entonces, al menos la descompresión y la compresión se ejecutarán en paralelo.bzip2
el uso de la CPU eclipsa agunzip
uno, por lo que en la práctica el paralelismo que se obtiene aquí es mínimo. Sin embargo, ¡no tener que hacer el disco IO sigue siendo agradable!El paralelo GNU ( http://www.gnu.org/software/parallel ) podría ser una opción si tiene múltiples núcleos (o incluso múltiples máquinas):
Lea el tutorial / página de manual para obtener detalles y opciones.
fuente
Lo que estás haciendo actualmente es tu mejor apuesta. No hay una herramienta de conversión disponible, e intentar bzip2 un archivo ya comprimido no es realmente una opción, ya que con frecuencia tiene efectos no deseados. Como el algoritmo es diferente, la conversión implicaría recuperar los datos originales independientemente. A menos que, por supuesto, gzipping haya sido un paso en el proceso de bzip2, en el que lamentablemente no lo es.
fuente
gzip
usa Leimpel-Ziv 77, mientrasbzip2
usa Burrows-Wheeler. Diferentes algoritmos, me temo.Ocasionalmente, necesito hacer lo mismo con los archivos de registro. Comienzo con los archivos * .gz más pequeños primero (
ls -rS
), gunzip y luego y bzip2 individualmente. No sé si es posible dirigir la salida gunzip directamente a la entrada bzip2. El comando bzip2 es mucho más lento en la compresión que gunzip en la descompresión que puede consumir la memoria e intercambiar espacio en el host.Mejoras o sugerencias son bienvenidas. Aquí está mi único revestimiento:
fuente
Si tiene más de unos pocos, consulte el artículo de LJ con un buen script de shell.
http://linuxgazette.net/123/bechtel.html
7zip obtiene una mejor compresión y es multihilo.
fuente
Solo tuve que hacer esto hace unos minutos:
Donde
rezip
se definiría como:Opcionalmente, también puede hacerlo multiproceso utilizando una
-P
opción conxargs
, pero tenga cuidado con esa. (¡Comienza bajo!)fuente