web-dev-qa-db-fra.com

Quelle est la différence entre différents systèmes de "compression"?

J'ai toujours utilisé TAR et Zip pour la compression, mais j'ai récemment entendu parler de l'algorithme de compression *.Z. Cela a soulevé une question pour moi:

Avec tous ces systèmes de compression, lequel est le meilleur pour une utilisation générale et la compression?

En effectuant quelques tests, j'ai découvert que tar, comme je l'ai découvert, ne compresse PAS réellement (sauf spécification explicite). En d'autres termes, à quoi sert-il par rapport aux autres méthodes de compression?

Je sais déjà que Zip est le système de compression le plus utilisé, mais dois-je l’utiliser à la place de *.Z, *.7z, .tar ou .tar.<insert ending here>?

Résumé du post:

  1. Devrais-je utiliser *.tar, *.Z, *.7z, .tar ou .tar.<insert ending here> pour obtenir la meilleure compression?
  2. Si plain *.tar ne compresse pas, pourquoi l'utilisons-nous?

EDIT: Tous les algorithmes ne permettent pas de stocker les permissions Linux (d'après ce que j'ai appris). Lequel fait-il, et y a-t-il une sorte de piratage (ou script) que je pourrais utiliser pour stocker des autorisations?

9
Kaz Wolfe

tar représente l'archive sur bande. Il ne fait que regrouper les fichiers et leurs métadonnées (autorisations, propriété, etc.) dans un flux d'octets pouvant être stockés sur un lecteur de bande (ou un fichier) et restaurés ultérieurement. La compression est une question entièrement distincte que vous utilisiez pour diriger la sortie via un utilitaire externe afin de compresser si vous le souhaitez. GNU tar était assez sympa pour ajouter des commutateurs lui indiquant de filtrer automatiquement la sortie via l'utilitaire approprié en tant que raccourci.

Zip et 7z combinent l'archivage et la compression dans leur propre format de conteneur. Ils sont conçus pour regrouper des fichiers sur un système DOS/Windows, de sorte qu'ils ne stockent pas les autorisations et la propriété Unix. Ainsi, si vous souhaitez stocker des autorisations pour des sauvegardes appropriées, vous devez vous en tenir à tar. Si vous envisagez d'échanger des fichiers avec des utilisateurs Windows, alors Zip ou 7z est recommandé. Les algorithmes de compression réels utilisés par Zip et 7Zip peuvent être utilisés avec tar, en utilisant respectivement gzip et lzma.

lzma (alias. * .xz) a l'un des meilleurs taux de compression et est assez rapide en décompression, ce qui en fait un choix de premier choix ces jours-ci. Cependant, il faut une tonne de temps de compression et de temps de traitement. Le vénérable gzip est un peu plus rapide en compression, donc peut être utilisé si vous ne voulez pas consacrer autant de temps à vos processeurs. Il a également une variante encore plus rapide appelée lzop. bzip2 est toujours assez populaire car il a largement remplacé gzip pendant un temps avant que 7Zip/Lzma ne soit apparu, car il obtenait de meilleurs taux de compression, mais il est en train de perdre la faveur depuis que 7z/lzma est plus rapide à la décompression et s'améliore taux de compression. L'utilitaire compress, qui nomme normalement les fichiers * .Z, est ancien et oublié depuis longtemps.

Une des autres différences importantes entre Zip et tar est que Zip compresse les données en petits morceaux, alors que lorsque vous compressez un fichier tar, vous compressez le tout en une fois. Ce dernier donne de meilleurs taux de compression, mais pour extraire un seul fichier à la fin de l'archive, vous devez décompresser le tout pour y accéder. Ainsi, le format Zip est meilleur pour extraire un seul fichier ou deux d'une grande archive. 7z et dar vous permettent de choisir de compresser le tout (mode "solide") ou de petits morceaux pour faciliter l'extraction fragmentée.

17
psusi

Les détails des algorithmes sont hors sujet ici1 puisqu'ils ne sont en aucun cas spécifiques à Linux, encore moins à Ubuntu. Vous trouverez cependant quelques informations intéressantes ici .

Passons maintenant à tar, comme vous l'avez dit, tar n'est pas et n'a jamais été un programme de compression. Au lieu de cela, il s'agit d'un archiveur ; Son objectif principal est de créer un gros fichier à partir de beaucoup de petits. Historiquement, c'était pour faciliter le stockage sur les lecteurs de bandes, d'où le nom: Tape ARchive.

Aujourd'hui, la principale raison d'utiliser tar est de réduire le nombre de fichiers sur votre système. Chaque fichier sur un système de fichiers Unix utilise un inode , plus vous avez de fichiers, moins vous avez d'inodes disponibles et lorsque vous manquez d'inodes, vous ne pouvez plus créer de nouveaux fichiers. Pour le dire simplement, la même quantité de données stockée que des milliers de fichiers occupera plus de votre disque dur que ces mêmes fichiers dans une seule archive tar.

Pour illustrer ceci, puisque cela a été contesté dans les commentaires, sur ma partition 68G /, j'ai le nombre suivant d’inodes utilisés et totaux (sachez que le nombre d’inodes dépend du type de système de fichiers et de la taille du fichier. cloison):

Inode count:              393216
Free inodes:              171421

Si je tente maintenant de créer plus de fichiers que d’inodes:

$ 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

Pas d'espace? Mais j'ai beaucoup d'espace:

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

Comme vous pouvez le voir ci-dessus, créer quelques centaines de milliers de fichiers vides épuise rapidement mes inodes et je ne peux plus en créer de nouveaux. Si je devais tar je pourrais recommencer à créer des fichiers.

Avoir moins de fichiers accélère également considérablement les E/S du système de fichiers, en particulier sur les systèmes de fichiers montés NFS. Je cible toujours mes anciens répertoires de travail à la fin d'un projet, car moins il y a de fichiers, plus les programmes rapides tels que find fonctionnent.

Il y a un excellente réponse sur Super User qui va beaucoup plus en détail, mais en plus de ce qui précède, les autres raisons fondamentales pour lesquelles tar est toujours populaire aujourd'hui sont:

  1. Efficacité: utiliser tar pour diriger un programme de compression tel que gzip est plus efficace, car il évite la création de fichiers intermédiaires.

  2. tar est livré avec toutes sortes de fonctionnalités, des fonctionnalités conçues au cours de sa longue histoire qui le rendent particulièrement utile pour les sauvegardes * nix (pensez aux autorisations, à la propriété des fichiers, à la possibilité de diriger les données directement vers STDOUT et par-dessus Lien SSH ...)

  3. Inertie. Nous sommes habitués à tar. Il est prudent de supposer qu'il sera disponible sur tout * nix que vous utiliserez peut-être, ce qui le rend très portable et pratique pour les archives de code source.


1 Ceci est absolument vrai et n'a rien à voir avec le fait que je n'en sais pas assez pour expliquer :)

9
terdon

Il existe deux tâches distinctes mais liées. Le regroupement d'une arborescence de fichiers (y compris les noms de fichiers, la structure de répertoires, les autorisations du système de fichiers, la propriété et toute autre métadonnée) dans un flux d'octets s'appelle archivage . La suppression de la redondance dans un flux d'octets afin de produire un flux d'octets plus petit s'appelle compression .

Sous Unix, les deux opérations sont séparées, avec des outils distincts pour chacune. Sur la plupart des autres plates-formes (actuelles et historiques), les outils combinés effectuent à la fois l'archivage et la compression.

(gzip et les autres programmes qui imitent l'interface de gzip ont souvent la possibilité de stocker le nom de fichier d'origine dans la sortie compressée, mais ceci, avec un contrôle CRC ou autre pour détecter la corruption, est la seule métadonnée qu'ils peuvent stocker.)

Séparer la compression de l'archivage présente des avantages. L'archivage est spécifique à la plate-forme (les métadonnées du système de fichiers devant être préservées varient largement), mais la mise en œuvre est simple, liée principalement aux E/S et évolue peu dans le temps. La compression est indépendante de la plate-forme, mais les implémentations sont liées au processeur et les algorithmes ne cessent de s'améliorer pour tirer parti des ressources accrues que le matériel moderne peut apporter au problème.

Le plus populaire des archiveurs Unix est tar, bien qu'il en existe d'autres tels que cpio et ar. (Les paquets Debian sont des archives ar, tandis que cpio est souvent utilisé pour les disques virtuels.) tar est ou a souvent été combiné à des outils de compression tels que compress (.Z) , gzip (.gz), bzip2 (.bz2) et xz (.xz), du plus ancien au plus récent, et pas par coïncidence du moins fort au meilleur.

Construire une archive tar et la compresser sont des étapes distinctes: le compresseur ignore tout du format de fichier tar. Cela signifie que pour extraire un seul fichier d'une archive compressée tar, vous devez décompresser tous les fichiers précédents. Ceci est souvent appelé une archive "solide".

De même, comme tar est un format "en continu" (nécessaire pour être utile dans un pipeline), il n’existe pas d’index global dans une archive tar, et répertorier le contenu d’une archive tar est aussi onéreux que son extraction.

En revanche, Zip et RAR et 7-Zip (les archiveurs les plus répandus sur les plates-formes Windows modernes) compressent généralement chaque fichier séparément et les métadonnées légèrement, voire pas du tout. Cela permet une liste peu coûteuse des fichiers dans une archive et l'extraction de fichiers individuels, mais signifie que la redondance entre plusieurs fichiers dans la même archive ne peut pas être exploitée pour augmenter la compression. Tandis qu'en général, compresser un fichier déjà compressé ne réduit pas davantage la taille du fichier, vous pouvez parfois voir un fichier Zip dans un fichier Zip: la première compression a transformé un grand nombre de petits fichiers en un seul gros fichier (probablement avec compression désactivée). compresser puis compressé en une seule entité.

Il existe une pollinisation croisée entre les différentes plates-formes et philosophies: gzip est essentiellement le compresseur de Zip sans son archiveur et xz est essentiellement le compresseur de 7-Zip _ sans son archiveur.

Il existe d'autres compresseurs spécialisés. PPM les variantes et leur successeur ZPAQ sont optimisés pour une compression maximale, quelle que soit la consommation de ressources. Ils peuvent facilement absorber autant de ressources CPU que RAM, et la décompression est aussi pénible que la compression (pour contraste, les outils de compression les plus utilisés sont asymétrique : la décompression est moins chère que la compression).

De l'autre côté du spectre, lzo, snappy et LZ4 sont des compresseurs "légers" conçus pour une vitesse maximale et une consommation minimale de ressources, au détriment de la compression. Ils sont largement utilisés dans les systèmes de fichiers et autres magasins d'objets, mais moins comme outils autonomes.


Alors, qui devriez-vous choisir?

Archivage:

Puisque vous êtes sur Ubuntu, il n’ya aucune raison d’utiliser autre chose que tar pour l’archivage, sauf si vous essayez de créer des fichiers facilement lisibles ailleurs.

Zip est difficile à battre pour son ubiquité, mais il n'est pas centré sur Unix et ne conservera pas les autorisations de votre système de fichiers ni les informations de propriété. Sa compression incorporée est désuète. 7-Zip et RAR (et ZPAQ) ont une compression plus moderne, mais ne sont pas non plus adaptés à l'archivage des systèmes de fichiers Unix (même si rien ne vous empêche de les utiliser comme des compresseurs); RAR est également propriétaire.

Compression:

Pour obtenir un maximum de compression, vous pouvez consulter un indice de référence, tel que l’énorme, situé sur le site http://mattmahoney.net/dc/text.html . Cela devrait vous donner une meilleure idée des compromis impliqués.

Cependant, vous ne voulez probablement pas une compression maximale. C'est trop cher.

xz est l'outil de compression polyvalent le plus populaire sur les systèmes Unix modernes. Je pense que 7-Zip peut aussi lire les fichiers xz, car ils sont étroitement liés.

Enfin, si vous archivez des données pour autre chose que le stockage à court terme, choisissez quelque chose de source ouverte et de préférence répandu, afin de minimiser les maux de tête plus tard.

4
hexwab

lzo, gz, b2, lzma (.lzma2 =.xz) sont des compresseurs "stream": ils compressent un flux de byes que vous ne connaissez pas et ne vous souciez pas des fichiers, des répertoires et des métadonnées comme les permissions. Vous devez utiliser un archiveur tel que tar pour regrouper toutes ces données dans un flux d'octets (un fichier tar) et les compresser avec un compresseur. S'il s'agit des données d'un seul fichier qui vous tient à cœur, vous pouvez également alimenter ce fichier seul vers l'un de ces compresseurs.

Tar, cpio and pax sont des archiveurs: ils prennent un tas de fichiers et de répertoires et encodent les données et les métadonnées dans un seul fichier. Le goudron est le plus populaire et le plus compatible, même si les mérites techniques entre les trois sont suffisamment minimes pour qu’il y ait eu des guerres de religion à la nuit des temps.

7z et Zip sont des compresseurs ET des arcihvers: stockez ensuite toutes les données et métadonnées et compressez-les. Cependant, AFAICT, aucun d'entre eux ne sauve les permissions Unix.

Zip utilise le même algorithme que gzip appelé DEFLATE. 7z utilise l'algorithme lzma

pour lire un seul fichier depuis un fichier tar.gz ou similaire, vous devez décompresser l'intégralité du flux gz jusqu'à ce que le fichier tar soit suffisamment exposé pour que vous puissiez l'extraire. Zip vous permet de compresser et d'extraire chaque fichier individuellement. 7z peut avoir l'un ou l'autre comportement.

Rapports et vitesses de compression: gzip et lzo ont des vitesses de compression et de décompression très très rapides mais des taux de compression bas. Il ne faut pas non plus beaucoup de mémoire pour compresser. gzip est un peu plus lent et donne un meilleur taux de compression que lzo.

Il est si rapide qu'il peut être plus rapide de lire un fichier compressé gz ou lzo à partir du disque et de le décompresser à la volée au lieu de lire le fichier non compressé directement à partir du disque.

LZMA (xz) donne une excellente compression sur les données générales, mais la compression et la décompression prennent beaucoup de temps et nécessitent une quantité de mémoire importante à compresser.

bz2 était l’algorithme de choix pour la compression élevée, mais est tombé en désuétude, car il est à la fois plus lent que lzma et prend plus de temps à compresser et à décompresser. Cependant, pour certains types de données (séquences d’adn, fichiers avec de très grands passages du même octet, etc.), bzip2 peut battre tout le reste sans la moindre hésitation. Par exemple, j’ai dû compresser un jour un fichier de 4 Go de 1 et b2 a réduit i à quelques 10 kb alors que Lzma prenait quelques 10 mb, si je me souviens bien.

1
staticd

Pour les fichiers particulièrement volumineux, vous pouvez utiliser rzip. Il examine d'abord les données redondantes à l'intérieur de gros blocs de 900 Mo, les code, puis les transmet à bzip2 (pas vraiment, mais les mêmes algorithmes sont utilisés).

Effet? Bien plus rapide que xz, lzma ou bzip2, et d'après mon expérience, son taux de compression rivalise avec celui de lzma. C'est un RAM porc, cependant.

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

0
user258532