¿Por qué los formatos de archivo tar cambian a compresión xz para reemplazar bzip2 y qué pasa con gzip?

202

Cada vez más tararchivos utilizan el xzformato basado en LZMA2 para la compresión en lugar de la bzip2(bz2)compresión tradicional . De hecho, kernel.org hizo un anuncio tardío de " Adiós bzip2 " , el 27 de diciembre de 2013 , indicando que las fuentes del núcleo se lanzarían a partir de este momento en formato tar.gz y tar.xz, y en la página principal del sitio web lo que se ofrece directamente está adentro tar.xz.

¿Hay alguna razón específica que explique por qué sucede esto y cuál es la relevancia de gzipeste contexto?


fuente

Respuestas:

198

Para distribuir archivos a través de Internet, las siguientes cosas son generalmente una prioridad:

  1. Relación de compresión (es decir, qué tan pequeño hace los datos el compresor);
  2. Tiempo de descompresión (requisitos de CPU);
  3. Requisitos de memoria de descompresión; y
  4. Compatibilidad (qué tan extendido es el programa de descompresión)

Los requisitos de memoria de compresión y CPU no son muy importantes, ya que puede usar una máquina grande y rápida para eso, y solo tiene que hacerlo una vez.

En comparación con bzip2, xz tiene una mejor relación de compresión y un menor (mejor) tiempo de descompresión. Sin embargo, en las configuraciones de compresión que se usan típicamente, requiere más memoria para descomprimir [1] y está algo menos extendido. Gzip usa menos memoria que cualquiera de los dos.

Por lo tanto, los archivos en formato gzip y xz se publican, lo que le permite elegir:

  • Necesita descomprimir en una máquina con memoria muy limitada (<32 MB): gzip. Dado, no es muy probable cuando se habla de fuentes de kernel.
  • Necesidad de descomprimir las herramientas mínimas disponibles: gzip
  • Quiere ahorrar tiempo de descarga y / o ancho de banda: xz

No existe realmente una combinación realista de factores que lo lleve a elegir bzip2. Por lo tanto, se está eliminando gradualmente.

Miré las comparaciones de compresión en una publicación de blog . No intenté replicar los resultados, y sospecho que algunos de ellos han cambiado (en su mayoría, espero que xzhayan mejorado, ya que es el más nuevo).

(Hay algunos escenarios específicos donde una buena implementación de bzip2 puede ser preferible a xz: bzip2 puede comprimir un archivo con muchos ceros y secuencias de ADN del genoma mejor que xz. Las versiones más nuevas de xz ahora tienen un modo de bloque (opcional) que permite la recuperación de datos después del punto de corrupción y compresión paralela y [en teoría] descompresión. Anteriormente, solo bzip2 ofrecía estos. [2] Sin embargo, ninguno de estos es relevante para la distribución del núcleo)


1: en tamaño de archivo, xz -3está alrededor bzip -9. Entonces xz usa menos memoria para descomprimir. Pero xz -9(como, por ejemplo, se usa para tarballs del kernel de Linux) usa mucho más que bzip -9. (E incluso xz -0necesita más que gzip -9).

2: Cambio amplio del sistema F21: lbzip2 como implementación predeterminada de bzip2

derobert
fuente
¿Algún comentario sobre el tema de la tolerancia a fallas o es algo que siempre se implementa completamente fuera de los algoritmos de compresión?
1
La resistencia de @ illuminÉ no se puede proporcionar sin sacrificar la relación de compresión. Es un problema ortogonal, y aunque existen herramientas como Parchive, para distribuir el manejo de errores del núcleo TCP funciona igual de bien.
Tobu
2
@ illuminÉ La tolerancia a fallos (suponiendo que se refiere a algo similar al par2) no suele ser una preocupación con la distribución de archivos a través de Internet. Se supone que las descargas son lo suficientemente confiables (y puede volver a descargarlas si estaban dañadas). Con frecuencia se utilizan hashes y firmas criptográficas, y detectan la corrupción y la manipulación. Hay compresores que dan mayor tolerancia a fallas, aunque a costa de la relación de compresión. Nadie parece encontrar la compensación que vale la pena para las descargas HTTP o FTP.
derobert
xz usa MENOS memoria para descomprimir.
MichalH
@ Mike ¿Ha cambiado desde que escribí esto? En particular, la nota al pie uno explica el uso de la memoria.
derobert
45

En primer lugar, esta pregunta no está directamente relacionada con tar. Tar solo crea un archivo sin comprimir, la compresión se aplica luego.

Se sabe que Gzip es relativamente rápido en comparación con LZMA2 y bzip2. Si la velocidad es importante, gzip(especialmente la implementación multiproceso pigz) suele ser un buen compromiso entre la velocidad de compresión y la relación de compresión. Aunque hay alternativas si la velocidad es un problema (por ejemplo, LZ4).

Sin embargo, si se desea una alta relación de compresión, LZMA2 late bzip2en casi todos los aspectos. La velocidad de compresión a menudo es más lenta, pero se descomprime mucho más rápido y proporciona una relación de compresión mucho mejor a costa de un mayor uso de memoria.

Ya no hay muchas razones para usar bzip2, excepto la compatibilidad con versiones anteriores. Además, LZMA2 se diseñó teniendo en cuenta el subprocesamiento múltiple y muchas implementaciones por defecto utilizan CPU multinúcleo (desafortunadamente xzen Linux todavía no lo hace). Esto tiene sentido ya que las velocidades del reloj ya no aumentarán, pero la cantidad de núcleos lo hará.

Hay bzip2implementaciones multiproceso (p pbzip. Ej. ), Pero a menudo no se instalan de manera predeterminada. También tenga en cuenta que los subprocesos múltiples bzip2solo rinden frutos durante la compresión, mientras que la descompresión usa un solo subproceso si el archivo se comprimió con un solo subproceso bzip2, en contraste con LZMA2. Las bzip2variantes paralelas solo pueden aprovechar las CPU multinúcleo si el archivo se comprimió con una bzip2versión paralela , que a menudo no es el caso.

Marco
fuente
44
Bueno, algunos alquitranes tienen una zopción.
tchrist
"velocidad" es una respuesta confusa, debe referirse a la velocidad de compresión o la velocidad de descompresión. Ni pixz, pbzip2 o pigz se instalan de manera predeterminada (o los utiliza tar sin el indicador -I), pero pixz y pbzip2 aceleran la compresión y descompresión y pigz es solo para compresión.
Tobu
@Tobu xzserá multiproceso de forma predeterminada, por lo que no pixzse requerirá instalación en el futuro. En algunas plataformas, el xzsubproceso ya es compatible. Mientras que bzip2es poco probable que sea multiproceso ya que el formato no fue diseñado teniendo en cuenta el multiproceso. Además, pbzip2solo acelera la descompresión si el archivo se ha comprimido usando lo pbzip2que a menudo no es el caso.
Marco
1
@Marco Creo que lbzip2 permite la descompresión paralela de archivos, incluso si fueron comprimidos con una implementación no paralela (por ejemplo, stock bzip2). Es por eso que uso lbzip2 sobre pbzip2. (Es posible que esto haya evolucionado desde su comentario.)
RaveTheTadpole
19

Respuesta corta : xz es más eficiente en términos de relación de compresión. Por lo tanto, ahorra espacio en disco y optimiza la transferencia a través de la red.
Puede ver este punto de referencia rápido para descubrir la diferencia mediante pruebas prácticas.

Slyx
fuente
El enlace está roto.
flarn2006
18

LZMA2 es un sistema de compresión de bloques mientras que gzip no lo es. Esto significa que LZMA2 se presta a subprocesos múltiples. Además, si se produce corrupción en un archivo, generalmente puede recuperar datos de bloques posteriores con LZMA2 pero no puede hacerlo con gzip. En la práctica, pierde todo el archivo con gzip después del bloque dañado. Con un archivo LZMA2, solo pierde los archivos afectados por los bloques dañados. Esto puede ser importante en archivos más grandes con múltiples archivos.

Mark Warburton
fuente
2
¡Esta es una distinción muy útil e importante, de hecho!
leden