Was ist der Unterschied zwischen verschiedenen Komprimierungssystemen?

9

Ich habe immer TAR und ZIP für die Komprimierung verwendet, aber kürzlich habe ich von dem *.ZKomprimierungsalgorithmus gehört. Dies warf eine Frage für mich auf:

Welches ist bei all diesen Komprimierungssystemen für den allgemeinen Gebrauch und die Komprimierung am besten geeignet?

Bei einigen Tests habe ich festgestellt, dass diese tar, wie ich festgestellt habe, NICHT wirklich komprimiert werden (sofern nicht ausdrücklich angegeben). Wofür ist es im Vergleich zu anderen Komprimierungsmethoden gut?

Ich bin schon bewusst , dass ZIP die am häufigsten verwendeten Kompressionssystem ist, aber sollte ich es statt *.Z, *.7z, .tar, oder .tar.<insert ending here>?

Beitragszusammenfassung:

  1. Soll ich *.tar, *.Z, *.7z, .tar, oder .tar.<insert ending here>für die beste Kompression?
  2. Wenn plain *.tarnicht komprimiert wird, warum verwenden wir es?

BEARBEITEN: Nicht alle Algorithmen erlauben das Speichern von Linux-Berechtigungen (nach dem, was ich gelernt habe). Was tun und gibt es eine Art Hack (oder Skript), mit dem ich Berechtigungen speichern könnte?

Kaz Wolfe
quelle
Es ist nicht nötig, das Zeug zu sagen, wählen Sie entweder das am besten gewählte oder das, das Sie am hilfreichsten fanden :)
Seth

Antworten:

17

tarsteht für Tape Archive. Alles, was es tut, ist, Dateien und ihre Metadaten (Berechtigungen, Besitz usw.) in einen Strom von Bytes zu packen, die auf einem Bandlaufwerk (oder einer Datei) gespeichert und später wiederhergestellt werden können. Die Komprimierung ist eine völlig separate Angelegenheit, bei der Sie die Ausgabe früher über ein externes Dienstprogramm leiten mussten, um sie zu komprimieren, wenn dies gewünscht wird. GNU tar war nett genug, um Schalter hinzuzufügen, die es anweisen, die Ausgabe automatisch über das entsprechende Dienstprogramm als Verknüpfung zu filtern.

Zip und 7z kombinieren die Archivierung und Komprimierung in einem eigenen Containerformat. Sie sollen Dateien auf einem DOS / Windows-System packen, sodass sie keine Unix-Berechtigungen und -Eigentümer speichern. Wenn Sie also Berechtigungen für ordnungsgemäße Sicherungen speichern möchten, müssen Sie sich an tar halten. Wenn Sie vorhaben, Dateien mit Windows-Benutzern auszutauschen, ist zip oder 7z gut. Die tatsächlichen Komprimierungsalgorithmen zip und 7zip Verwendung mit Teer verwendet werden, durch uzing gzipund lzmajeweils.

lzma (auch bekannt als. * .xz) hat eines der besten Komprimierungsverhältnisse und ist bei der Dekomprimierung recht schnell, was es heutzutage zu einer Top-Wahl macht. Das Komprimieren erfordert jedoch eine Menge RAM- und CPU-Zeit. Der Ehrwürdige gzipist bei der Komprimierung viel schneller und kann daher verwendet werden, wenn Sie nicht so viel CPU-Zeit verwenden möchten. Es hat auch eine noch schnellere Variante namens lzop. bzip2ist immer noch ziemlich beliebt, da es gzip eine Zeit lang weitgehend ersetzte, bevor 7zip / lzma entstand, da es bessere Komprimierungsverhältnisse hatte, aber heutzutage in Ungnade fällt, da 7z / lzma bei der Dekomprimierung schneller ist und bessere Komprimierungsverhältnisse erzielt. Das compressDienstprogramm, das normalerweise Dateien * .Z benennt, ist uralt und längst vergessen.

Einer der anderen wichtigen Unterschiede zwischen zip und tar besteht darin, dass zip die Daten in kleinen Blöcken komprimiert, während Sie beim Komprimieren einer tar-Datei das Ganze auf einmal komprimieren. Letzteres bietet bessere Komprimierungsverhältnisse. Um jedoch eine einzelne Datei am Ende des Archivs zu extrahieren, müssen Sie das Ganze dekomprimieren, um darauf zuzugreifen. Daher ist das Zip-Format besser geeignet, um eine oder zwei einzelne Dateien aus einem großen Archiv zu extrahieren. 7z und darSie können wählen, ob Sie das Ganze (als "fester" Modus bezeichnet) oder kleine Stücke für eine einfache stückweise Extraktion komprimieren möchten.

psusi
quelle
Aber nur TAR unterstützt Metadaten? Oder unterstützt gzip / bzip2 jetzt auch Metadaten
Kaz Wolfe
@pacificfils, die Komprimierungsdienstprogramme komprimieren nur eine einzelne Datei ohne Metadaten.
Psusi
Kann man einen Ordner tarieren und dann in eine Zip-Datei legen und die Berechtigungen trotzdem beibehalten?
Kaz Wolfe
@pacificfils, ja, aber es wäre ein bisschen albern, da Sie die Vorteile von zip und das bessere Komprimierungsverhältnis von aufgeben würden gzip.
Psusi
@pacificfils behält tar cfpdie Berechtigungen bei. Eine TAR-Datei ist nicht komprimiert, daher komprimieren zip (7-zip), gzip2, gzip, lzo usw. eine TAR-Datei gut (im Allgemeinen ist es unwahrscheinlich, dass ein Teer komprimierter Dateien komprimierbar ist).
Elliott Frisch
9

Die Details der Algorithmen sind hier nicht zum Thema 1, da sie in keiner Weise spezifisch für Linux sind, geschweige denn für Ubuntu. Sie finden jedoch einige nette Infos hier .

Nun zu tar, wie Sie sagten, tarist und war nie ein Komprimierungsprogramm. Stattdessen ist es ein Archivierer ; Sein Hauptzweck ist es, aus vielen kleinen eine große Datei zu machen. In der Vergangenheit sollte dies das Speichern auf Bandlaufwerken erleichtern, daher der Name: Tape ARchive.

Heutzutage besteht der Hauptgrund für die Verwendung tardarin, die Anzahl der Dateien auf Ihrem System zu verringern. Jede Datei in einem Unix-Dateisystem belegt einen Inode . Je mehr Dateien Sie haben, desto weniger Inodes sind verfügbar. Wenn Ihnen die Inodes ausgehen, können Sie keine neuen Dateien mehr erstellen. Einfach ausgedrückt, die gleiche Datenmenge, die als Tausende von Dateien gespeichert ist, beansprucht mehr von Ihrer Festplatte als dieselben Dateien in einem einzigen Tar-Archiv.

Da dies in den Kommentaren bestritten wurde /, habe ich auf meiner 68G- Partition die folgende Anzahl an insgesamt und verwendeten Inodes (beachten Sie, dass die Anzahl der Inodes vom Dateisystemtyp und der Größe der Partition abhängt):

Inode count:              393216
Free inodes:              171421

Wenn ich jetzt versuche, mehr Dateien als Inodes zu erstellen:

$ 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

Kein Platz? Aber ich habe viel Platz:

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

Wie Sie oben sehen können, werden durch das Erstellen einiger hunderttausend leerer Dateien meine Inodes schnell aufgebraucht, und ich kann keine neuen mehr erstellen. Wenn ich tardiese wäre, könnte ich wieder mit dem Erstellen von Dateien beginnen.

Wenn weniger Dateien vorhanden sind, wird auch die Dateisystem-E / A erheblich beschleunigt, insbesondere bei NFS-gemounteten Dateisystemen. Ich tariere immer meine alten Arbeitsverzeichnisse, wenn ein Projekt abgeschlossen ist, denn je weniger Dateien ich habe, desto schneller findfunktionieren Programme wie .

Es gibt eine großartige Antwort auf Super User, die viel detaillierter ist, aber zusätzlich zu den oben genannten sind die anderen grundlegenden Gründe, warum sie tarheute noch beliebt sind, folgende:

  1. Effizienz: Die Verwendung tarzum Durchleiten eines Komprimierungsprogramms wie gzipist effizienter, da die Erstellung von Zwischendateien vermieden wird.

  2. tar kommt mit allen Arten von Schnickschnack, Funktionen, die im Laufe ihrer langen Geschichte entwickelt wurden und die es besonders nützlich für * nix-Backups machen (denken Sie an Berechtigungen, Dateibesitz, die Möglichkeit, Daten direkt an STDOUT und über eine SSH-Verbindung weiterzuleiten ... )

  3. Trägheit. Wir sind es gewohnt tar. Es ist sicher anzunehmen, dass es auf jedem * nix verfügbar ist, den Sie möglicherweise verwenden, was es sehr portabel und praktisch für Quellcode-Tarballs macht.


1 Das ist absolut wahr und hat nichts damit zu tun, dass ich nicht genug über sie weiß, um es zu erklären :)

Terdon
quelle
3
Mein Computer hatte (in der Vergangenheit) mehr als 10.000.000 Dateien, und das ist nicht wirklich verrückt. Ich benutze tares nie, um "die Anzahl der Dateien zu reduzieren", da es den meisten Dateisystemen ehrlich gesagt egal ist und es sowieso nicht wirklich optimal ist, da tares keinen einfachen zufälligen Zugriff auf Dateien unterstützt. Vielmehr besteht die Hauptanwendung (für mich und ich denke für die meisten Leute) darin, Dateien (z. B. Quellcode) auf einfache Weise mit anderen Menschen zu teilen.
Nneonneo
@nneonneo Musstest du jemals mit Millionen von Dateien in einem einzigen Verzeichnis arbeiten? Ich habe und glaube mir, es ist nicht einfach. Abgesehen von den offensichtlichen Problemen mit ARG_MAXkann dies den Umgang mit Ihren Dateien in irgendeiner Weise problematisch machen und ein (schlecht) eingerichtetes Netzwerk, in dem Dateien auf einem zentralen Server gespeichert und mit NFS geteilt werden, in die Knie zwingen. Um die Anzahl der Dateien insgesamt zu verringern, benötigen Sie weit mehr Dateien, um dies zu bemerken. Bei Mehrbenutzer-Setups kann die Anzahl der Inodes jedoch tatsächlich begrenzt werden.
Terdon
@nneonneo, um ein konkreteres Beispiel zu geben, tune2fs -lauf der Partition, die mein $ HOME enthält, wird mir mitgeteilt, dass ich 19.300.352 Inodes habe. Ich werde nicht in der Lage sein, mehr Dateien als das zu erstellen. Wie Sie sagten, ist 10 ^ 6 nicht verrückt, auch nicht in den höheren Bereichen. Je nachdem , was Sie tun können Sie bedürften Art und Weise mehr als das.
Terdon
@nneonneo In der aktualisierten Antwort finden Sie ein Beispiel aus der Praxis, wie Ihnen leicht die Inodes ausgehen können.
Terdon
Mein Server verwendet etwas mehr als 1 Million Inodes, und das liegt nur daran, dass ich eine Tonne E-Mails habe (viele Mailinglisten mit hohem Datenverkehr, die seit Jahren bestehen) und diese im Maildir-Format speichere. Ich habe keine Ahnung, was Sie möglicherweise tun könnten, um 19 Millionen Inodes zu verbrauchen. Sie müssten über 7 Monate lang jede Sekunde 24 Stunden am Tag eine neue Datei erstellen.
Psusi
4

Es gibt zwei unterschiedliche, aber verwandte Aufgaben. Das Packen eines Baums von Dateien (einschließlich Dateinamen, Verzeichnisstruktur, Dateisystemberechtigungen, Besitz und anderer Metadaten) in einen Bytestream wird als Archivierung bezeichnet . Das Entfernen der Redundanz in einem Byte-Stream, um einen kleineren Byte-Stream zu erzeugen, wird als Komprimierung bezeichnet .

Unter Unix sind die beiden Vorgänge mit jeweils unterschiedlichen Werkzeugen getrennt. Auf den meisten anderen Plattformen (aktuelle und historische) führen kombinierte Tools sowohl Archivierung als auch Komprimierung durch.

(gzip und andere Programme, die die Benutzeroberfläche von gzip imitieren, haben häufig die Möglichkeit, den ursprünglichen Dateinamen in der komprimierten Ausgabe zu speichern. Dies ist jedoch zusammen mit einer CRC oder einer anderen Überprüfung zur Erkennung von Beschädigungen die einzige Metadaten, die sie speichern können.)

Die Trennung von Komprimierung und Archivierung bietet Vorteile. Die Archivierung ist plattformspezifisch (die zu speichernden Metadaten des Dateisystems variieren stark), die Implementierung ist jedoch unkompliziert, weitgehend E / A-gebunden und ändert sich im Laufe der Zeit kaum. Die Komprimierung ist plattformunabhängig, aber die Implementierungen sind CPU-gebunden und die Algorithmen werden ständig verbessert, um die erhöhten Ressourcen zu nutzen, die moderne Hardware für das Problem bereitstellen kann.

Der beliebteste Unix-Archivierer ist tar, obwohl es andere wie cpiound gibt ar. (Debian-Pakete sind arArchive, während sie cpiohäufig für anfängliche RAM-Disks verwendet werden.) Werden taroder wurden häufig mit Komprimierungswerkzeugen wie compress(.Z), gzip(.gz), bzip2(.bz2) und xz(.xz) vom ältesten bis zum jüngsten kombiniert und nicht zufällig von der schlechtesten zur besten Komprimierung.

Das tarErstellen und Komprimieren eines Archivs sind verschiedene Schritte: Der Kompressor weiß nichts über das tarDateiformat. Dies bedeutet, dass zum Extrahieren einer einzelnen Datei aus einem komprimierten tarArchiv alle vorhergehenden Dateien dekomprimiert werden müssen. Dies wird oft als "solides" Archiv bezeichnet.

Da es sich bei tar um ein "Streaming" -Format handelt, das für die Verwendung in einer Pipeline erforderlich ist, gibt es in einem Teerarchiv keinen globalen Index, und das Auflisten des Inhalts eines Teerarchivs ist genauso teuer wie das Extrahieren.

Im Gegensatz dazu komprimieren Zip und RAR sowie 7-zip (die beliebtesten Archivierer auf modernen Windows-Plattformen) normalerweise jede Datei separat und komprimieren Metadaten, wenn überhaupt, leicht. Dies ermöglicht eine kostengünstige Auflistung der Dateien in einem Archiv und das Extrahieren einzelner Dateien, bedeutet jedoch, dass die Redundanz zwischen mehreren Dateien im selben Archiv nicht ausgenutzt werden kann, um die Komprimierung zu erhöhen. Während das Komprimieren einer bereits komprimierten Datei im Allgemeinen die Dateigröße nicht weiter verringert, wird gelegentlich eine Zip-Datei in einer Zip-Datei angezeigt: Beim ersten Zippen wurden viele kleine Dateien in eine große Datei umgewandelt (wahrscheinlich mit deaktivierter Komprimierung), bei der zweiten Zippen dann komprimiert als eine Einheit.

Es gibt eine gegenseitige Bestäubung zwischen den verschiedenen Plattformen und Philosophien: Es gziphandelt sich im Wesentlichen um zipden Kompressor ohne Archivierer und xzim Wesentlichen um 7-zipden Kompressor ohne Archivierer.

Es gibt andere spezialisierte Kompressoren. PPM-Varianten und deren Nachfolger ZPAQsind für eine maximale Komprimierung unabhängig vom Ressourcenverbrauch optimiert. Sie können leicht so viel CPU und RAM zerkauen, wie Sie auf sie werfen können, und die Dekomprimierung ist genauso anstrengend wie die Komprimierung (im Gegensatz dazu sind die meisten weit verbreiteten Komprimierungswerkzeuge asymmetrisch : Dekomprimierung ist billiger als Komprimierung).

Am anderen Ende des Spektrums lzo, snappyund LZ4werden als „light“ Kompressoren für maximale Geschwindigkeit und minimalen Ressourcenverbrauch ausgelegt, auf Kosten der Kompression. Sie werden häufig in Dateisystemen und anderen Objektspeichern verwendet, jedoch weniger als eigenständige Tools.


Also, welche solltest du wählen?

Archivierung:

Da Sie unter Ubuntu arbeiten, gibt es keinen wirklichen Grund, etwas anderes als die tarArchivierung zu verwenden, es sei denn, Sie versuchen, Dateien zu erstellen, die an anderer Stelle leicht lesbar sind.

zipist für die Allgegenwart schwer zu übertreffen, aber es ist nicht Unix-zentriert und speichert nicht die Berechtigungen und Besitzinformationen Ihres Dateisystems, und die eingebaute Komprimierung ist veraltet. 7-zip und RAR (und ZPAQ) verfügen über eine modernere Komprimierung, sind jedoch für die Archivierung von Unix-Dateisystemen gleichermaßen ungeeignet (obwohl nichts Sie davon abhält, sie nur als Kompressoren zu verwenden). RAR ist ebenfalls proprietär.

Kompression:

Für maximale Komprimierung können Sie sich einen Benchmark ansehen, wie den riesigen unter http://mattmahoney.net/dc/text.html . Dies sollte Ihnen eine bessere Vorstellung von den damit verbundenen Kompromissen geben.

Sie möchten jedoch wahrscheinlich keine maximale Komprimierung. Es ist viel zu teuer.

xzist das beliebteste Allzweck-Komprimierungswerkzeug auf modernen Unix-Systemen. Ich glaube, 7-zip kann auch xz-Dateien lesen, da sie eng miteinander verbunden sind.

Schließlich: Wenn Sie Daten für etwas anderes als die kurzfristige Speicherung archivieren, sollten Sie sich für Open Source entscheiden, das vorzugsweise weit verbreitet ist, um später Kopfschmerzen zu minimieren.

Hexwab
quelle
1

lzo, gz, b2, lzma (.lzma2 =.xz)sind "Stream" -Kompressoren: Sie komprimieren einen Stream von Byes und wissen nichts und kümmern sich nicht um Dateien, Verzeichnisse und Metadaten wie Berechtigungen. Sie müssen einen Archivierer wie tar verwenden, um all diese Daten in einem Bytestrom (einer TAR-Datei) zu bündeln und mit einem Kompressor zu komprimieren. Wenn es sich um die Daten einer einzelnen Datei handelt, die Sie interessieren, können Sie diese Datei auch alleine einem dieser Kompressoren zuführen.

Tar, cpio and paxsind Archivierer: Sie nehmen eine Reihe von Dateien und Verzeichnissen und codieren die Daten und Metadaten in einer einzigen Datei. Teer ist der beliebteste und kompatibelste, obwohl die technischen Vorzüge zwischen den drei so gering sind, dass es im Laufe der Zeit zu Religionskriegen kam.

7z und zip sind Kompressoren UND Arcihver: Speichern Sie dann alle Daten und Metadaten und komprimieren Sie sie. Allerdings AFAICT, keiner von ihnen speichert Unix-Berechtigungen.

Zip verwendet denselben Algorithmus wie gzip namens DEFLATE. 7z verwendet den lzma-Algorithmus

Um eine einzelne Datei aus einem tar.gz oder ähnlichem zu lesen, müssen Sie den gesamten gz-Stream dekomprimieren, bis genügend tar-Datei verfügbar ist, damit Sie sie extrahieren können. Mit Zip können Sie jede Datei einzeln komprimieren und herausziehen. 7z kann beide Verhaltensweisen haben.

Kompressionsverhältnisse und -geschwindigkeiten: gzip und lzo haben sehr sehr schnelle Kompressions- und Dekompressionsgeschwindigkeiten, aber niedrige Kompressionsverhältnisse. Das Komprimieren erfordert auch nicht viel Speicher. gzip ist etwas langsamer und bietet ein etwas besseres Kompressionsverhältnis als lzo.

Es ist so schnell, dass es schneller sein kann, eine komprimierte gz- oder lzo-Datei von der Festplatte zu lesen und im laufenden Betrieb zu dekomprimieren, anstatt die unkomprimierte Datei direkt von der Festplatte zu lesen.

LZMA (xz) bietet eine hervorragende Komprimierung allgemeiner Daten, das Komprimieren und Dekomprimieren dauert jedoch sehr lange, und das Komprimieren erfordert erhebliche Speichermengen.

bz2 war früher der Algorithmus der Wahl mit hoher Komprimierung, geriet jedoch in Ungnade, da es sowohl langsamer als lzma ist als auch länger zum Komprimieren und Dekomprimieren benötigt. Für bestimmte Arten von Daten (DNA-Sequenzen, Dateien mit sehr großen Durchläufen desselben Bytes usw.) kann bzip2 jedoch alles andere zweifellos übertreffen. Als Beispiel musste ich einmal eine 4-GB-Datei mit 1 komprimieren und b2 reduzierte i auf einige 10 KB, während lzma einige 10 MB nahm, wenn ich mich richtig erinnere.

statisch
quelle
Eigentlich ist lzma ziemlich schnell beim Dekomprimieren.
Psusi
0

Für besonders große Dateien können Sie verwenden rzip. Zuerst werden redundante Daten in 900 MB großen Blöcken untersucht, diese codiert und dann an bzip2 übergeben (nicht wirklich, aber es werden dieselben Algorithmen verwendet).

Bewirken? Viel schneller als xz, lzmaoder bzip2, und in meiner Erfahrung seines Verdichtungsverhältnis Rivalen , dass die lzma. Es ist jedoch ein RAM-Schwein.

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

user258532
quelle