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


9

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

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

En exécutant quelques tests, j'ai découvert que tar, comme je l'ai découvert, ne compresse PAS vraiment (sauf indication contraire explicite). Qu'est-ce que c'est bon par rapport à d'autres méthodes de compression?

Je suis déjà au courant que ZIP est le système de compression les plus utilisés, mais dois - je utiliser au lieu de *.Z, *.7z, .tarou .tar.<insert ending here>?

Résumé du message:

  1. Dois - je utiliser *.tar, *.Z, *.7z, .tarou .tar.<insert ending here>pour la meilleure compression?
  2. Si plain *.tarne se comprime pas, pourquoi l'utilisons-nous?

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


Il n'y a pas besoin de dire ce genre de choses, choisissez simplement celui qui a été le mieux voté ou celui que vous avez trouvé le plus utile :)
Seth

Réponses:


17

tarsignifie archive sur bande. Il ne fait que regrouper les fichiers et leurs métadonnées (autorisations, propriété, etc.) dans un flux d'octets qui peuvent ê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 aviez l'habitude de diriger la sortie via un utilitaire externe pour compresser si vous le souhaitez. GNU tar était assez sympa pour ajouter des commutateurs pour lui dire de filtrer automatiquement la sortie via l'utilitaire approprié comme raccourci.

Zip et 7z combinent l'archivage et la compression dans leur propre format de conteneur, et ils sont destinés à emballer 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 prévoyez d'échanger des fichiers avec des utilisateurs Windows, alors zip ou 7z est bon. Les algorithmes de compression réels utilisés par zip et 7zip peuvent être utilisés avec tar, par uzing gzipet lzmarespectivement.

lzma (aka. * .xz) a l'un des meilleurs taux de compression et est assez rapide en décompression, ce qui en fait un choix de choix de nos jours. Cependant, il faut une tonne de RAM et de CPU pour se comprimer. Le vénérable gzipest un peu plus rapide à la compression, il peut donc être utilisé si vous ne souhaitez pas consacrer autant de temps au processeur. Il a également une variante encore plus rapide appelée lzop. bzip2est encore assez populaire car il a largement remplacé gzip pendant un certain temps avant la création de 7zip / lzma, car il a obtenu de meilleurs taux de compression, mais tombe en disgrâce ces jours-ci, car 7z / lzma est plus rapide à la décompression et obtient de meilleurs taux de compression. L' compressutilitaire, qui nomme normalement les fichiers * .Z, est ancien et oublié depuis longtemps.

L'une des autres différences importantes entre zip et tar est que zip compresse les données en petits morceaux, tandis que lorsque vous compressez un fichier tar, vous compressez le tout à la 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 darvous permettent de choisir de compresser le tout (appelé mode "solide") ou de petits morceaux pour une extraction fragmentaire facile.


Mais, seul TAR prend en charge les métadonnées? Ou est-ce que gzip / bzip2 prend également en charge les métadonnées
Kaz Wolfe

@pacificfils, les utilitaires de compression ne compressent qu'un seul fichier, sans métadonnées.
psusi

peut-on tarer un dossier, puis le mettre dans un zip et conserver les autorisations?
Kaz Wolfe

@pacificfils, oui, mais ce serait un peu idiot car vous renonceriez aux avantages du zip et au meilleur taux de compression de gzip.
psusi

@pacificfils tar cfpconservera les autorisations. Un fichier tar n'est pas compressé, donc zip (7-zip), gzip2, gzip, lzo, etc. compresseront tous bien un fichier tar (en général, un tar de fichiers compressés ne sera probablement pas compressible).
Elliott Frisch

9

Les détails des algorithmes sont hors sujet ici 1 car ils ne sont en aucun cas spécifiques à Linux, sans parler d'Ubuntu. Vous trouverez cependant de belles informations ici .

Maintenant tar, comme vous l'avez dit, ce tarn'est pas et n'a jamais été un programme de compression. Au lieu de cela, c'est un archiveur ; son objectif principal est de créer un gros fichier à partir d'un grand nombre de petits. Historiquement, c'était pour faciliter le stockage sur des lecteurs de bande, d'où le nom: Tape ARchive.

Aujourd'hui, la principale raison d'utiliser tarest de diminuer le nombre de fichiers sur votre système. Chaque fichier sur un système de fichiers Unix prend un inode , plus vous avez de fichiers, moins 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ées sous forme de milliers de fichiers occupera plus de votre disque dur que ces mêmes fichiers dans une seule archive tar.

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

Inode count:              393216
Free inodes:              171421

Si je tente maintenant de créer plus de fichiers que je n'en ai 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, la création de quelques centaines de milliers de fichiers vides épuise rapidement mes inodes et je ne peux plus en créer de nouveaux. Si je tardevais les utiliser, 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 tare toujours mes anciens répertoires de travail lorsqu'un projet est terminé, car moins il y a de fichiers, plus les programmes comme findfonctionneront rapidement .

Il y a une 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 qui tarsont toujours populaires aujourd'hui sont:

  1. Efficacité: utiliser tarpour diriger à travers un programme de compression comme gzipest plus efficace car il évite la création de fichiers intermédiaires.

  2. tar est livré avec toutes sortes de cloches et de sifflets, des fonctionnalités qui ont été 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 via un lien SSH ... )

  3. Inertie. Nous sommes habitués tar. Il est sûr de supposer qu'il sera disponible sur n'importe quel * nix que vous pourriez utiliser, ce qui le rend très portable et pratique pour les tarballs de code source.


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


3
Mon ordinateur a eu (dans le passé) plus de 10 000 000 de fichiers, et ce n'est pas vraiment trop fou. Je n'utilise jamais tarpour "réduire le nombre de fichiers" car la plupart des systèmes de fichiers s'en moquent franchement, et ce n'est pas vraiment optimal de toute façon car taril ne prend pas en charge l'accès aléatoire facile aux fichiers. Au contraire, l'utilisation principale (pour moi et je pense pour la plupart des gens) est de partager des fichiers (par exemple le code source) avec d'autres personnes de manière simple.
nneonneo

@nneonneo avez-vous déjà dû travailler avec des millions de fichiers dans un seul répertoire? J'ai et croyez-moi, ce n'est pas facile. Indépendamment des problèmes évidents avec ARG_MAX, cela peut rendre le traitement de vos fichiers quelque peu compliqué et peut réellement amener un réseau (mal) configuré où les fichiers sont stockés sur un serveur central et partagés avec NFS à genoux. En ce qui concerne la réduction globale du nombre de fichiers, vous aurez besoin de bien plus de fichiers que cela pour le remarquer, mais dans les configurations multi-utilisateurs, le nombre d'inodes peut en effet devenir limitant.
terdon

@nneonneo pour donner un exemple plus concret, tune2fs -lsur la partition contenant mon $ HOME me dit que j'ai 19 300 352 inodes. Je ne pourrai pas créer plus de fichiers que ça. Comme vous l'avez dit, 10 ^ 6 n'est pas fou, même pas dans les gammes supérieures. Selon ce que vous faites, vous pouvez avoir besoin de bien plus que cela.
terdon

@nneonneo voir la réponse mise à jour pour un exemple réel de la façon dont vous pouvez facilement manquer d'inodes.
terdon

Mon serveur utilise un peu plus d'un million d'inodes et c'est uniquement parce que j'ai une tonne métrique d'e-mails (beaucoup de listes de diffusion à fort trafic remontant à des années) et que je les stocke au format Maildir. Je n'ai aucune idée de ce que vous pourriez faire pour utiliser 19 millions d'inodes. Vous devrez créer un nouveau fichier toutes les secondes, 24 heures par jour, pendant plus de 7 mois.
psusi

4

Il y a deux tâches distinctes mais liées. L'intégration d'une arborescence de fichiers (y compris les noms de fichiers, la structure des répertoires, les autorisations du système de fichiers, la propriété et toute autre métadonnée) dans un flux d'octets est appelée archivage . La suppression de la redondance dans un flux d'octets pour produire un flux d'octets plus petit est appelée 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 d'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 cela, avec un CRC ou une autre vérification pour détecter la corruption, est la seule métadonnée qu'ils peuvent stocker.)

Il y a des avantages à séparer la compression de l'archivage. L'archivage est spécifique à la plate-forme (les métadonnées du système de fichiers à conserver varient considérablement), mais l'implémentation est simple, largement liée aux E / S et change peu au fil du temps. La compression est indépendante de la plate-forme, mais les implémentations sont liées au processeur et les algorithmes s'améliorent constamment pour tirer parti des ressources accrues que le matériel moderne peut apporter pour résoudre le problème.

L'archiveur Unix le plus populaire est tar, bien qu'il existe d'autres tels que cpioet ar. (Les paquets Debian sont des ararchives, alors qu'il cpioest souvent utilisé pour les disques virtuels initiaux.) tarEst ou a souvent été combiné avec des outils de compression tels que compress(.Z), gzip(.gz), bzip2(.bz2) et xz(.xz), du plus ancien au plus jeune , et non par coïncidence de la pire à la meilleure compression.

Faire une tararchive et la compresser sont des étapes distinctes: le compresseur ne sait rien du tarformat de fichier. Cela signifie que l'extraction d'un seul fichier à partir d'une tararchive compressée nécessite la décompression de tous les fichiers précédents. Ceci est souvent appelé une archive "solide".

De même, comme tar est un format de "streaming" - nécessaire pour qu'il soit utile dans un pipeline - il n'y a pas d'index global dans une archive tar, et lister le contenu d'une archive tar est tout aussi cher que de l'extraire.

En revanche, Zip et RAR et 7-zip (les archiveurs les plus populaires sur les plates-formes Windows modernes) compressent généralement chaque fichier séparément, et compressent légèrement les métadonnées, voire pas du tout. Cela permet une liste bon marché 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. Alors qu'en général, la compression d'un fichier déjà compressé ne réduit pas davantage la taille du fichier, parfois vous pouvez voir un fichier zip dans un fichier zip: le premier zip a transformé beaucoup de petits fichiers en un seul gros fichier (probablement avec la compression désactivée), ce que le second compresser puis compressé comme une seule entité.

Il existe une pollinisation croisée entre les différentes plates-formes et philosophies: gzipest essentiellement ziple compresseur sans son archiveur, et xzest essentiellement 7-ziple compresseur sans son archiveur.

Il existe d'autres compresseurs spécialisés. Les variantes PPM et leur successeur ZPAQsont optimisés pour une compression maximale sans égard à la consommation des ressources. Ils peuvent facilement mâcher autant de CPU et de RAM que vous pouvez leur jeter, et la décompression est tout aussi pénible que la compression (pour le contraste, les outils de compression les plus utilisés sont asymétriques : la décompression est moins chère que la compression).

À l'autre extrémité du spectre, lzo, snappyet LZ4sont « légers » compresseurs conçus pour une vitesse maximale et la consommation minimum de ressources, au coût 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, que devez-vous choisir?

Archivage:

Puisque vous êtes sur Ubuntu, il n'y a aucune raison réelle d'utiliser autre chose que tarpour l'archivage, sauf si vous essayez de créer des fichiers facilement lisibles ailleurs.

zipest difficile à battre pour l'ubiquité, mais il n'est pas centré sur Unix et ne conservera pas les autorisations de votre système de fichiers et les informations de propriété, et sa compression intégrée est désuète. 7-zip et RAR (et ZPAQ) ont une compression plus moderne mais ne conviennent pas non plus à l'archivage des systèmes de fichiers Unix (bien que rien ne vous empêche de les utiliser comme compresseurs); RAR est également propriétaire.

Compression:

Pour une compression maximale, vous pouvez consulter une référence, comme l'énorme à http://mattmahoney.net/dc/text.html . Cela devrait vous donner une meilleure idée des compromis impliqués.

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

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

Enfin: si vous archivez des données pour autre chose qu'un stockage à court terme, vous devez choisir quelque chose d'open source et de préférence répandu, pour minimiser les maux de tête plus tard.


1

lzo, gz, b2, lzma (.lzma2 =.xz)sont des compresseurs de "flux": ils compressent un flux d'octets et ne se soucient pas des fichiers, des répertoires et des métadonnées comme les autorisations. Vous devez utiliser un archiveur comme 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 intéressent, vous pouvez également alimenter ce fichier seul à l'un de ces compresseurs.

Tar, cpio and paxsont 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, bien que les mérites techniques entre les trois soient suffisamment minimes pour qu'il y ait eu des guerres de religion à ce sujet à l'aube des temps.

7z et zip sont des compresseurs ET arcihvers: Ensuite, stockez toutes les données et métadonnées et compressez-les. Cependant AFAICT, aucun d'entre eux ne sauvegarde les autorisations Unix.

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

pour lire un seul fichier à partir d'un fichier tar.gz ou similaire, vous devrez décompresser l'ensemble du flux gz jusqu'à ce que la quantité suffisante du fichier tar soit exposée afin de pouvoir 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 de faibles taux de compression. Il ne faut pas non plus beaucoup de mémoire pour compresser. gzip est un peu plus lent et donne un taux de compression un peu meilleur 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) offre une excellente compression sur les données générales mais prend très longtemps pour compresser et décompresser tout en prenant une quantité importante de mémoire à compresser.

bz2 était l'algorithme de compression élevée de choix, mais il est tombé en disgrâce 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 grandes séries du même octet, etc.) bzip2 peut battre tout le reste à la main. Par exemple, j'ai dû une fois compresser un fichier de 4 Go de 1 et b2 a réduit i à quelques 10 de ko tandis que lzma a pris environ 10 de Mo si je me souviens bien.


En fait, lzma est assez rapide pour décompresser.
psusi

0

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

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

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

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.