¿Cuál es la diferencia entre diferentes sistemas de "compresión"?

9

Siempre he usado TAR y ZIP para la compresión, pero recientemente escuché sobre el *.Zalgoritmo de compresión. Esto me trajo una pregunta:

Con todos estos sistemas de compresión, ¿cuál es el mejor para uso general y compresión?

Al ejecutar algunas pruebas, descubrí que tar, como descubrí, NO se comprime realmente (a menos que se especifique explícitamente). Es decir, ¿para qué sirve en comparación con otros métodos de compresión?

Soy consciente de que ya postal es el sistema de compresión más ampliamente utilizado, ya menudo debo usar en lugar de *.Z, *.7z, .tar, o .tar.<insert ending here>?

Resumen de la publicación:

  1. ¿Debo usar *.tar, *.Z, *.7z, .tar, o .tar.<insert ending here>para la mejor compresión?
  2. Si plain *.tarno se comprime, ¿por qué lo usamos?

EDITAR: No todos los algoritmos permiten almacenar permisos de Linux (de lo que aprendí). ¿Qué hago y hay algún tipo de pirateo (o script) que podría usar para almacenar permisos?

Kaz Wolfe
fuente
No hay necesidad de decir eso, solo elige el que haya votado mejor o el que te haya resultado más útil :)
Seth

Respuestas:

17

tarsignifica archivo de cinta. Todo lo que hace es empaquetar archivos y sus metadatos (permisos, propiedad, etc.) en una secuencia de bytes que pueden almacenarse en una unidad de cinta (o un archivo) y restaurarse más tarde. La compresión es un asunto completamente separado que solía tener que canalizar la salida a través de una utilidad externa para comprimir si así lo deseaba. GNU tar fue lo suficientemente agradable como para agregar interruptores para decirle que filtre automáticamente la salida a través de la utilidad adecuada como acceso directo.

Zip y 7z combinan el archivo y la compresión en su propio formato contenedor, y están destinados a empaquetar archivos en un sistema DOS / Windows, por lo que no almacenan los permisos y la propiedad de Unix. Por lo tanto, si desea almacenar los permisos para las copias de seguridad adecuadas, debe seguir con tar. Si planea intercambiar archivos con usuarios de Windows, entonces zip o 7z es bueno. Los algoritmos de compresión reales de uso zip y 7zip se pueden usar con tar, uzing gzipy lzmarespectivamente.

lzma (también conocido como * .xz) tiene una de las mejores relaciones de compresión, y es bastante rápido en descompresión, por lo que es una de las mejores opciones en estos días. Sin embargo, requiere una tonelada de tiempo de RAM y CPU para comprimir. El venerable gzipes bastante más rápido en la compresión, por lo que puede usarse si no desea dedicar tanto tiempo de CPU. También tiene una variante aún más rápida llamada lzop. bzip2sigue siendo bastante popular ya que reemplazó en gran medida a gzip por un tiempo antes de que surgiera 7zip / lzma, ya que obtuvo mejores relaciones de compresión, pero está cayendo en desgracia en estos días ya que 7z / lzma es más rápido en la descompresión y obtiene mejores relaciones de compresión. La compressutilidad, que normalmente nombra archivos * .Z, es antigua y olvidada hace mucho tiempo.

Una de las otras diferencias importantes entre zip y tar es que zip comprime los datos en pequeños fragmentos, mientras que cuando comprime un archivo tar, comprime todo de una vez. Este último proporciona mejores relaciones de compresión, pero para extraer un solo archivo al final del archivo, debe descomprimir todo para acceder a él. Por lo tanto, el formato zip es mejor para extraer uno o dos archivos de un archivo grande. 7z y le darpermite elegir comprimir todo (llamado modo "sólido") o pequeños trozos para una fácil extracción por partes.

psusi
fuente
Pero, ¿solo TAR admite metadatos? ¿O gzip / bzip2 ahora también admite metadatos?
Kaz Wolfe
@pacificfils, las utilidades de compresión solo comprimen un solo archivo, sin metadatos.
psusi
¿Puede uno tar una carpeta y luego poner eso en un zip y conservar los permisos?
Kaz Wolfe
@pacificfils, sí, pero sería un poco tonto ya que renunciaría a los beneficios de zip y la mejor relación de compresión de gzip.
psusi
@pacificfils tar cfppreservará los permisos. Un archivo tar no está comprimido, por lo que zip (7-zip), gzip2, gzip, lzo, etc. comprimirán bien un archivo tar (en general, es poco probable que un archivo de archivos comprimidos sea comprimible).
Elliott Frisch
9

Los detalles de los algoritmos están fuera de tema aquí 1 ya que no son de ninguna manera específicos de Linux, y mucho menos de Ubuntu. Sin embargo, encontrará información agradable aquí .

Ahora tar, como dijiste, tarno es y nunca ha sido un programa de compresión. En cambio, es un archivador ; Su propósito principal es hacer un archivo grande de muchos pequeños. Históricamente, esto era para facilitar el almacenamiento en unidades de cinta, de ahí el nombre: Tape ARchive.

Hoy, la razón principal para usar tares disminuir la cantidad de archivos en su sistema. Cada archivo en un sistema de archivos Unix ocupa un inodo , cuantos más archivos tenga, menos inodos disponibles y cuando se quede sin inodos, ya no podrá crear nuevos archivos. En pocas palabras, la misma cantidad de datos almacenados que miles de archivos ocuparán más de su disco duro que esos mismos archivos en un solo archivo tar.

Para ilustrar, dado que esto ha sido cuestionado en los comentarios, en mi /partición 68G , tengo el siguiente número de inodos totales y usados ​​(tenga en cuenta que el recuento de inodos depende del tipo de sistema de archivos y el tamaño de la partición):

Inode count:              393216
Free inodes:              171421

Si ahora procedo a intentar crear más archivos de los que tengo inodos:

$ touch {1..171422}
touch: cannot touch ‘171388’: No space left on device
touch: cannot touch ‘171389’: No space left on device
touch: cannot touch ‘171390’: No space left on device
touch: cannot touch ‘171391’: No space left on device
touch: cannot touch ‘171392’: No space left on device
touch: cannot touch ‘171393’: No space left on device
touch: cannot touch ‘171394’: No space left on device
touch: cannot touch ‘171395’: No space left on device
touch: cannot touch ‘171396’: No space left on device
touch: cannot touch ‘171397’: No space left on device

¿Sin espacio? Pero tengo mucho espacio:

$ df -h
Filesystem      Size  Used Avail Use% Mounted on
/dev/sda1       5,8G  4,3G  1,2G  79% /

Como puede ver arriba, crear unos cientos de miles de archivos vacíos agota rápidamente mis inodos y ya no puedo crear nuevos. Si fuera a tarestos, podría comenzar a crear archivos nuevamente.

Tener menos archivos también acelera enormemente la E / S del sistema de archivos, especialmente en sistemas de archivos montados en NFS. Siempre alquilo mis antiguos directorios de trabajo cuando finalizo un proyecto, ya que cuantos menos archivos tenga, los programas más rápidos findfuncionarán.

Hay una gran respuesta en Super Usuario que entra en más detalles, pero además de lo anterior, las otras razones básicas por las tarque todavía es popular hoy en día son:

  1. Eficiencia: usar tarpara canalizar a través de un programa de compresión como gzipes más eficiente ya que evita la creación de archivos intermedios.

  2. tar viene con todo tipo de campanas y silbatos, características que han sido diseñadas a lo largo de su larga historia que lo hacen particularmente útil para las copias de seguridad * nix (permisos de pensar, propiedad de archivos, la capacidad de canalizar datos directamente a STDOUT y a través de un enlace SSH ... )

  3. Inercia. Estamos acostumbrados a tar. Es seguro asumir que estará disponible en cualquier * nix que pueda utilizar, lo que lo hace muy portátil y útil para los tarballs de código fuente.


1 Esto es absolutamente cierto y no tiene nada que ver con el hecho de que no sé lo suficiente sobre ellos para explicar :)

terdon
fuente
3
Mi computadora ha tenido (en el pasado) más de 10,000,000 de archivos, y eso no es realmente una locura. Nunca uso tarpara "reducir la cantidad de archivos", ya que a la mayoría de los sistemas de archivos francamente no me importa, y de todos modos no es realmente óptimo ya tarque no admite un acceso aleatorio fácil a los archivos. Más bien, el uso principal (para mí y creo que para la mayoría de las personas) es compartir archivos (por ejemplo, código fuente) con otras personas de una manera simple.
nneonneo
@nneonneo ¿alguna vez has tenido que trabajar con millones de archivos en un solo directorio? Tengo y créanme que no es fácil. Aparte de los problemas obvios con ARG_MAX, esto puede hacer que lidiar con sus archivos de cualquier manera sea una molestia y, de hecho, puede generar una red (mal) configurada donde los archivos se almacenan en un servidor central y se comparten con NFS. En cuanto a reducir el número de archivos en general, necesitará muchos más archivos que eso para notar, pero en configuraciones de múltiples usuarios, el número de inodos puede llegar a ser limitante.
terdon
@nneonneo para dar un ejemplo más concreto, tune2fs -len la partición que contiene mi $ HOME me dice que tengo 19,300,352 inodes. No podré crear más archivos que eso. Como dijiste, 10 ^ 6 no es una locura, ni siquiera en los rangos más altos realmente. Dependiendo de lo que esté haciendo, puede necesitar mucho más que eso.
terdon
@nneonneo vea la respuesta actualizada para un ejemplo del mundo real de cómo puede quedarse sin inodos fácilmente.
terdon
Mi servidor está utilizando poco más de 1 millón de inodes y eso es solo porque tengo una tonelada métrica de correo electrónico (muchas listas de correo de alto tráfico que se remontan durante años) y lo almaceno en formato Maildir. No tengo idea de lo que podrías estar haciendo para usar hasta 19 millones de inodes. Tendría que crear un nuevo archivo cada segundo, las 24 horas del día, durante más de 7 meses.
psusi
4

Hay dos tareas distintas pero relacionadas. El empaquetado de un árbol de archivos (incluidos los nombres de archivo, la estructura de directorios, los permisos del sistema de archivos, la propiedad y cualquier otro metadato) en una secuencia de bytes se denomina archivado . Eliminar la redundancia en una secuencia de bytes para producir una secuencia de bytes más pequeña se denomina compresión .

En Unix, las dos operaciones están separadas, con herramientas distintas para cada una. En la mayoría de las otras plataformas (actuales e históricas), las herramientas combinadas realizan el archivado y la compresión.

(gzip y otros programas que imitan la interfaz de gzip a menudo tienen la opción de almacenar el nombre de archivo original en la salida comprimida, pero esto, junto con un CRC u otra verificación para detectar la corrupción, son los únicos metadatos que pueden almacenar).

Hay ventajas en separar la compresión del archivo. El archivado es específico de la plataforma (los metadatos del sistema de archivos que necesitan preservarse varían ampliamente), pero la implementación es sencilla, en gran medida vinculada a E / S, y cambia poco con el tiempo. La compresión es independiente de la plataforma, pero las implementaciones están vinculadas a la CPU y los algoritmos mejoran constantemente para aprovechar los mayores recursos que el hardware moderno puede aportar al problema.

El archivador de Unix más popular es tar, aunque existen otros como cpioy ar. (Los paquetes de Debian son ararchivos, mientras cpioque a menudo se usan para discos RAM iniciales). Se combina taro se ha combinado a menudo con herramientas de compresión como compress(.Z), gzip(.gz), bzip2(.bz2) y xz(.xz), desde la más antigua hasta la más joven. , y no casualmente de peor a mejor compresión.

Hacer un tararchivo comprimido y comprimirlo son pasos distintos: el compresor no sabe nada sobre el tarformato del archivo. Esto significa que extraer un solo archivo de un tararchivo comprimido requiere descomprimir todos los archivos anteriores. Esto a menudo se llama un archivo "sólido".

Del mismo modo, dado que tar es un formato de "transmisión", necesario para que sea útil en una tubería, no hay un índice global en un archivo tar, y enumerar el contenido de un archivo tar es tan costoso como extraerlo.

Por el contrario, Zip y RAR y 7-zip (los archivadores más populares en las plataformas modernas de Windows) generalmente comprimen cada archivo por separado, y comprimen los metadatos ligeramente si es que lo hacen. Esto permite una lista barata de los archivos en un archivo y la extracción de archivos individuales, pero significa que la redundancia entre múltiples archivos en el mismo archivo no puede ser explotada para aumentar la compresión. Si bien, en general, comprimir un archivo ya comprimido no reduce aún más el tamaño del archivo, ocasionalmente puede ver un archivo zip dentro de un archivo zip: la primera compresión convirtió muchos archivos pequeños en un archivo grande (probablemente con la compresión desactivada), que el segundo comprimir y luego comprimir como una sola entidad.

Existe una polinización cruzada entre las diferentes plataformas y filosofías: gzipes esencialmente zipel compresor sin su archivador, y xzes esencialmente 7-zipel compresor sin su archivador.

Hay otros compresores especializados. Las variantes de PPM y su sucesor ZPAQestán optimizadas para una compresión máxima sin tener en cuenta el consumo de recursos. Pueden masticar fácilmente tanta CPU y RAM como pueda arrojarles, y la descompresión es tan exigente como la compresión (por el contrario, las herramientas de compresión más utilizadas son asimétricas : descomprimir es más barato que comprimir).

En el otro extremo del espectro, lzo, snappyy LZ4son compresores de "luz", diseñado para una máxima velocidad y mínimo consumo de recursos, a costa de compresión. Son ampliamente utilizados en sistemas de archivos y otros almacenes de objetos, pero no tanto como herramientas independientes.


Entonces, ¿cuál debes elegir?

Archivado:

Dado que está en Ubuntu, no hay ninguna razón real para usar otra cosa que no sea el tararchivado, a menos que esté tratando de crear archivos que sean fácilmente legibles en otro lugar.

zipes difícil de superar por la ubicuidad, pero no está centrado en Unix y no mantendrá los permisos del sistema de archivos y la información de propiedad, y su compresión integrada es anticuada. 7-zip y RAR (y ZPAQ) tienen una compresión más moderna pero no son adecuados para archivar sistemas de archivos Unix (aunque no hay nada que le impida usarlos solo como compresores); RAR también es propietario.

Compresión:

Para obtener la máxima compresión, puede echar un vistazo a un punto de referencia, como el enorme en http://mattmahoney.net/dc/text.html . Esto debería darle una mejor idea de las compensaciones involucradas.

Sin embargo, probablemente no desee la máxima compresión. Es muy caro.

xzes la herramienta de compresión de uso general más popular en los sistemas Unix modernos. Creo que 7-zip también puede leer archivos xz, ya que están estrechamente relacionados.

Finalmente: si está archivando datos para algo que no sea almacenamiento a corto plazo, debe elegir algo de código abierto y preferiblemente extendido, para minimizar los dolores de cabeza más adelante.

hexwab
fuente
1

lzo, gz, b2, lzma (.lzma2 =.xz)son compresores de "flujo": comprimen un flujo de byes y no saben y no les importan los archivos, directorios y metadatos como los permisos. Debe usar un archivador como tar para agrupar todos esos datos en una secuencia de bytes (un archivo tar) y comprimirlos con un compresor. Si lo que le interesa son los datos de un solo archivo, también puede alimentar ese archivo solo a uno de estos compresores.

Tar, cpio and paxson archivadores: toman un montón de archivos y directorios y codifican los datos y metadatos en un solo archivo. El alquitrán es el más popular y más compatible, aunque los méritos técnicos entre los tres son lo suficientemente mínimos como para que haya guerras religiosas al respecto en los albores del tiempo.

7z y zip son compresores Y arcihvers: luego almacene todos los datos y metadatos y comprímalos. Sin embargo, AFAICT, ninguno de ellos guarda los permisos de Unix.

Zip usa el mismo algoritmo que gzip llamado DEFLATE. 7z usa el algoritmo lzma

para leer un solo archivo de un tar.gz o similar, deberá descomprimir toda la secuencia gz hasta que se exponga la cantidad suficiente del archivo tar para poder extraerlo. Zip le permite comprimir y extraer cada archivo individualmente. 7z puede tener cualquier comportamiento.

Relaciones y velocidades de compresión: gzip y lzo tienen velocidades de compresión y descompresión muy muy rápidas pero bajas relaciones de compresión. Tampoco se necesita mucha memoria para comprimir. gzip es un poco más lento y ofrece una mejor relación de compresión que lzo.

Es tan rápido que puede ser más rápido leer un archivo comprimido gz o lzo del disco y descomprimirlo sobre la marcha en lugar de leer el archivo sin comprimir directamente del disco.

LZMA (xz) proporciona una excelente compresión en los datos generales, pero lleva mucho tiempo comprimir y descomprimir, además de requerir una cantidad significativa de memoria para comprimir.

bz2 solía ser el algoritmo de elección de alta compresión, pero cayó en desgracia, ya que es más lento que lzma y lleva más tiempo comprimir y descomprimir. Sin embargo, para ciertos tipos de datos (secuencias de ADN, archivos con ejecuciones muy grandes del mismo byte, etc.) bzip2 puede vencer a todo lo demás. Como ejemplo, una vez tuve que comprimir un archivo de 4GB de 1's y b2 redujo i a unos 10's de kb mientras que lzma tomó unos 10's de MB si no recuerdo mal.

estático
fuente
En realidad, lzma es bastante rápido descomprimiendo.
psusi
0

Para archivos especialmente grandes, puede usar rzip. Primero analiza los datos redundantes dentro de bloques grandes de 900 MB, los codifica y luego los entrega a bzip2 (en realidad no, pero se utilizan los mismos algoritmos).

¿Efecto? Mucho más rápido que xz, lzmao bzip2, y en mi experiencia, su relación de compresión rivaliza con la de lzma. Sin embargo, es un cerdo RAM.

http://en.wikipedia.org/wiki/Rzip

usuario258532
fuente