Warum werden Tar-Archivformate auf die xz-Komprimierung umgestellt, um bzip2 zu ersetzen, und was ist mit gzip?

202

Immer mehr tarArchive verwenden xzanstelle der herkömmlichen bzip2(bz2)Komprimierung das auf LZMA2 basierende Format für die Komprimierung. Tatsächlich gab kernel.org am 27. Dezember 2013 eine späte " Good-bye bzip2 " -Ankündigung heraus, in der darauf hingewiesen wurde , dass Kernel-Quellen ab diesem Zeitpunkt sowohl im tar.gz- als auch im tar.xz-Format - und auf der Hauptseite der Website - veröffentlicht würden Was direkt angeboten wird, ist in .tar.xz

Gibt es bestimmte Gründe, die erklären, warum dies geschieht und welche Relevanz dies gzipin diesem Zusammenhang hat?


quelle

Antworten:

198

Bei der Verteilung von Archiven über das Internet haben im Allgemeinen die folgenden Punkte Priorität:

  1. Kompressionsverhältnis (dh wie klein der Kompressor die Daten macht);
  2. Dekomprimierungszeit (CPU-Anforderungen);
  3. Speicheranforderungen für die Dekomprimierung; und
  4. Kompatibilität (wie weit verbreitet das Dekomprimierungsprogramm ist)

Die Anforderungen an den Komprimierungsspeicher und die CPU sind nicht sehr wichtig, da Sie dafür eine große schnelle Maschine verwenden können und dies nur einmal tun müssen.

Im Vergleich zu bzip2 hat xz ein besseres Komprimierungsverhältnis und eine niedrigere (bessere) Dekomprimierungszeit. Bei den normalerweise verwendeten Komprimierungseinstellungen wird jedoch mehr Speicher zum Dekomprimieren benötigt [1] und ist etwas weniger verbreitet. Gzip benötigt weniger Speicher als beide.

Daher werden sowohl Archive im gzip- als auch im xz-Format gepostet, sodass Sie Folgendes auswählen können:

  • Muss auf einem Computer mit sehr begrenztem Speicher (<32 MB) dekomprimiert werden : gzip. Gegeben, nicht sehr wahrscheinlich, wenn es um Kernelquellen geht.
  • Es müssen nur wenige Tools dekomprimiert werden: gzip
  • Möchten Sie Download-Zeit und / oder Bandbreite sparen: xz

Es gibt nicht wirklich eine realistische Kombination von Faktoren, die Sie dazu bringen würden, bzip2 auszuwählen. Also wird es auslaufen.

In einem Blog-Beitrag habe ich mir Komprimierungsvergleiche angesehen . Ich habe nicht versucht, die Ergebnisse zu replizieren, und ich vermute, dass sich einiges davon geändert hat (meistens habe ich damit gerechnet, dass es xzsich verbessert hat, da es das neueste ist.)

(Es gibt einige spezifische Szenarien, in denen eine gute bzip2-Implementierung gegenüber xz vorzuziehen ist: bzip2 kann eine Datei mit vielen Nullen und Genom-DNA-Sequenzen besser komprimieren als xz. Neuere Versionen von xz verfügen jetzt über einen (optionalen) Blockmodus, der die Datenwiederherstellung ermöglicht nach dem Punkt der Korruption und parallel Kompression und [theoretisch] Dekompression. Zuvor bot nur bzip2 diese. [2] jedoch keines von diesem für kernel Verteilung relevant ist)


1: In Archivgröße xz -3ist um bzip -9. Dann benötigt xz weniger Speicher zum Dekomprimieren. Aber xz -9(wie z. B. für Linux-Kernel-Tarballs verwendet) verwendet viel mehr als bzip -9. (Und xz -0braucht sogar mehr als gzip -9).

2: F21 System Wide Change: lbzip2 als Standard bzip2 Implementierung

derobert
quelle
Irgendwelche Kommentare zum Thema Fehlertoleranz oder ist das etwas, das immer komplett außerhalb von Kompressionsalgorithmen implementiert wird?
1
@ illuminÉ-Ausfallsicherheit kann nicht ohne Einbußen beim Komprimierungsverhältnis bereitgestellt werden. Es ist ein orthogonales Problem, und obwohl es Tools wie Parchive gibt, ist die Verteilung der Fehlerbehandlung des Kernel-TCP genau richtig.
Tobu
2
@ illuminÉ Fehlertoleranz (vorausgesetzt, Sie meinen etwas Ähnliches wie par2) ist normalerweise kein Problem beim Verteilen von Archiven über das Internet. Downloads werden als zuverlässig genug angesehen (und Sie können sie nur erneut herunterladen, wenn sie beschädigt wurden). Kryptografische Hashes und Signaturen werden häufig verwendet und erkennen sowohl Korruption als auch Manipulation. Es gibt Kompressoren, die eine größere Fehlertoleranz bieten, allerdings auf Kosten des Kompressionsverhältnisses. Niemand scheint den Kompromiss zu finden, der sich für HTTP- oder FTP-Downloads lohnt.
Derobert
xz verwendet WENIGER Speicher zum Dekomprimieren.
MichalH
@ Mike Hat es sich geändert, seit ich das geschrieben habe? Insbesondere wird in Fußnote 1 die Speichernutzung erläutert.
Derobert
45

Erstens steht diese Frage nicht in direktem Zusammenhang mit tar. Tar erstellt nur ein unkomprimiertes Archiv, die Komprimierung wird dann später angewendet.

Es ist bekannt, dass Gzip im Vergleich zu LZMA2 und bzip2 relativ schnell ist. Wenn es auf die Geschwindigkeit ankommt gzip(insbesondere die Multithread-Implementierung pigz), ist dies oft ein guter Kompromiss zwischen Komprimierungsgeschwindigkeit und Komprimierungsverhältnis. Obwohl es Alternativen gibt, wenn es um Geschwindigkeit geht (z. B. LZ4).

Wenn jedoch ein hohes Komprimierungsverhältnis gewünscht wird, schlägt LZMA2 bzip2in nahezu jedem Aspekt. Die Komprimierungsgeschwindigkeit ist oft langsamer, dekomprimiert jedoch viel schneller und bietet ein viel besseres Komprimierungsverhältnis auf Kosten einer höheren Speichernutzung.

bzip2Abgesehen von der Abwärtskompatibilität gibt es keinen Grund, mehr zu verwenden . Darüber hinaus wurde LZMA2 im Hinblick auf Multithreading entwickelt und viele Implementierungen verwenden standardmäßig Multicore-CPUs (dies ist xzunter Linux leider noch nicht der Fall). Dies ist sinnvoll, da sich die Taktraten nicht mehr erhöhen, sondern die Anzahl der Kerne.

Es gibt Multithread- bzip2Implementierungen (z. B. pbzip), die jedoch häufig nicht standardmäßig installiert werden. Beachten Sie auch, dass sich Multithreading bzip2beim Komprimieren nur wirklich auszahlt, während beim Dekomprimieren bzip2im Gegensatz zu LZMA2 ein einziger Thread verwendet wird, wenn die Datei mit einem einzigen Thread komprimiert wurde. Parallele bzip2Varianten können Multicore-CPUs nur dann nutzen, wenn die Datei mit einer parallelen bzip2Version komprimiert wurde , was häufig nicht der Fall ist.

Marco
quelle
4
Nun, einige Teere sind eine zOption.
Tchrist
"speed" sorgt für eine verwirrte Antwort, Sie sollten sich auf die Kompressionsgeschwindigkeit oder die Dekompressionsgeschwindigkeit beziehen. Weder pixz, pbzip2 noch pigz werden standardmäßig installiert (oder von tar ohne das -I-Flag verwendet), aber pixz und pbzip2 beschleunigen die Komprimierung und Dekomprimierung, und pigz dient nur der Komprimierung.
Tobu
@Tobu xzwird standardmäßig mit mehreren Threads betrieben , sodass pixzin Zukunft keine Installation erforderlich ist. Auf einigen Plattformen wird das xzThreading bereits unterstützt. Wobei bzip2Multithreading unwahrscheinlich sein wird, da das Format nicht für Multithreading konzipiert wurde. Außerdem wird pbzip2die Dekomprimierung nur beschleunigt, wenn die Datei mit komprimiert wurde, pbzip2was häufig nicht der Fall ist.
Marco
1
@Marco Ich glaube, lbzip2 ermöglicht die parallele Dekomprimierung von Dateien, auch wenn diese mit einer nicht parallelen Implementierung komprimiert wurden (z. B. stock bzip2). Deshalb benutze ich lbzip2 über pbzip2. (Möglicherweise hat sich dies seit Ihrem Kommentar
geändert
19

Kurze Antwort : xz ist effizienter in Bezug auf das Kompressionsverhältnis. Das spart Speicherplatz und optimiert die Übertragung über das Netzwerk.
Sie können diesen Quick Benchmark sehen , um den Unterschied durch praktische Tests zu entdecken.

Slyx
quelle
Verbindung ist unterbrochen.
Flarn2006
18

LZMA2 ist ein Blockkomprimierungssystem, gzip dagegen nicht. Dies bedeutet, dass sich LZMA2 für Multithreading eignet. Wenn in einem Archiv eine Beschädigung auftritt, können Sie im Allgemeinen mit LZMA2 Daten aus nachfolgenden Blöcken wiederherstellen, dies ist jedoch mit gzip nicht möglich. In der Praxis verlieren Sie nach dem beschädigten Block das gesamte Archiv mit gzip. Bei einem LZMA2-Archiv verlieren Sie nur die Dateien, die von den beschädigten Blöcken betroffen sind. Dies kann bei größeren Archiven mit mehreren Dateien wichtig sein.

Mark Warburton
quelle
2
Dies ist in der Tat eine sehr nützliche und wichtige Unterscheidung!
Leden