Ich habe gerade ein kleines Experiment gemacht, in dem ich ein Tar-Archiv mit doppelten Dateien erstellt habe, um zu sehen, ob es komprimiert werden würde. Zu meiner Ehrfurcht war es nicht! Details folgen (Ergebnisse für Lesevergnügen eingerückt):
$ dd if=/dev/urandom bs=1M count=1 of=a
1+0 records in
1+0 records out
1048576 bytes (1.0 MB) copied, 0.114354 s, 9.2 MB/s
$ cp a b
$ ln a c
$ ll
total 3072
-rw-r--r-- 2 guido guido 1048576 Sep 24 15:51 a
-rw-r--r-- 1 guido guido 1048576 Sep 24 15:51 b
-rw-r--r-- 2 guido guido 1048576 Sep 24 15:51 c
$ tar -c * -f test.tar
$ ls -l test.tar
-rw-r--r-- 1 guido guido 2109440 Sep 24 15:51 test.tar
$ gzip test.tar
$ ls -l test.tar.gz
-rw-r--r-- 1 guido guido 2097921 Sep 24 15:51 test.tar.gz
$
Zuerst habe ich eine 1MiB-Datei mit zufälligen Daten erstellt (a). Dann habe ich es in eine Datei b kopiert und es auch mit c verknüpft. Bei der Erstellung des Tarballs war tar anscheinend der Hardlink bekannt, da der Tarball nur ~ 2 MB und nicht ~ 3 MB groß war.
Nun erwartete ich, dass gzip die Größe des Tarballs auf ~ 1MiB reduziert, da a und b Duplikate sind, und es sollte 1MiB fortlaufende Daten geben, die im Tarball wiederholt werden, dies trat jedoch nicht auf.
Warum ist das? Und wie könnte ich das Archiv in diesen Fällen effizient komprimieren?
quelle
xz -9 -M 95%
oder sogarxz -M 95% --lzma2=preset=9,dict=1610612736
. Es wird nicht schnell gehen, aber es ist unwahrscheinlich, dass Ihre Duplikate im Ergebnis verbleiben.Nicole Hamilton merkt korrekterweise an, dass
gzip
aufgrund der geringen Größe des Wörterbuchs keine entfernten doppelten Daten gefunden werden.bzip2
ist ähnlich, weil es auf 900 KB Speicher begrenzt ist.Versuchen Sie stattdessen Folgendes:
LZMA / LZMA2-Algorithmus (
xz
,7z
)Der LZMA-Algorithmus gehört zur selben Familie wie Deflate, verwendet jedoch ein viel größeres Wörterbuch (anpassbar; Standard ist etwa 384 MB). Das
xz
Dienstprogramm, das standardmäßig auf den neuesten Linux-Distributionen installiert werden sollte, ähneltgzip
und verwendet LZMA.Da LZMA Redundanzen mit größerer Reichweite erkennt, kann es Ihre Daten hier deduplizieren. Es ist jedoch langsamer als Gzip.
Eine weitere Option ist 7-zip (
7z
imp7zip
Paket enthalten). Hierbei handelt es sich um einen Archivierer (und nicht um einen Single-Stream-Kompressor), der standardmäßig LZMA verwendet (geschrieben vom Autor von LZMA). Der 7-zip-Archivierer führt eine eigene Deduplizierung auf Dateiebene durch (bei Dateien mit derselben Erweiterung), wenn er in seinem.7z
Format archiviert . Dies bedeutet , dass , wenn Sie bereit sind , ersetzentar
mit7z
, erhalten Sie identische Dateien dedupliziert. 7z behält jedoch keine Zeitstempel, Berechtigungen oder Xattrs für Nanosekunden bei, sodass es möglicherweise nicht Ihren Anforderungen entspricht.lrzip
lrzip
ist ein Kompressor, der die Daten vorverarbeitet, um Fernredundanz zu beseitigen, bevor sie einem herkömmlichen Algorithmus wie Gzip / Deflate, bzip2, lzop oder LZMA zugeführt werden. Für die hier angegebenen Beispieldaten ist dies nicht erforderlich. Dies ist nützlich, wenn die Eingabedaten größer sind als der Speicherplatz.Für diese Art von Daten (duplizierte inkomprimierbare Blöcke) sollten Sie die
lzop
Komprimierung (sehr schnell) mit verwendenlrzip
, da es keinen Vorteil hat, sich nach der Deduplizierung mehr Mühe zu geben, vollständig zufällige Daten zu komprimieren.Bup und Obnam
Da Sie die Frage getaggt Backup , wenn Ihr Ziel ist die Sicherung von Daten, sollten Sie mit einem Deduplizierung Backup - Programm wie Bup oder Obnam .
quelle
Im Falle einer Sicherung, möglicherweise mit einem größeren Satz kleinerer Dateien, besteht ein Trick, der für Sie möglicherweise funktioniert, darin, die Dateien im Teer nach Erweiterung zu sortieren:
quelle
rev
(warum sogar umkehren und dann sortieren?) Und schaue auf diesort
Option "-r, --reverse" (obwohl ich nicht sicher bin, warum Sie überhaupt eine Umkehrung wollen). Aber ich denke, Ihretar
Option "-I
" macht nicht das, was Sie denken, es macht "-I, --use-compress-program PROG
" , Sie wollen wahrscheinlich "-T, --files-from FILE"| tar czf my_archive.tar.gz -I -
sollte sein| xargs tar Azf my_archive.tar.gz
rev
kehrt die Reihenfolge der Zeichen in jeder Zeile um, nicht die Zeilenreihenfolge im Stream. Aus diesem Grundsort
werden die Dateien nach ihrer Erweiterung gruppiert. Ich vermute das-I -
hätte sein sollen-T -
, das die Dateiliste auf stdin liefert.rev
würde irgendwie durch Erweiterung arrangieren, nicht, dass es in Linux sowieso viele Erweiterungen gibt. Ich könnte mir vorstellen, dass das Sortieren nach Größe die Wahrscheinlichkeit erhöht, dassgzip
findet keine Duplikate, auchxz
bei einer riesigen Wörterbuchgröße nicht. Was Sie tun können, ist zu verwendenmksquashfs
- dies spart in der Tat Platz für Duplikate.Einige schnelle Testergebnisse mit
xz
undmksquashfs
mit drei zufälligen Binärdateien (64 MB), von denen zwei gleich sind:Installieren:
Kürbisse:
xz:
quelle
Number of duplicate files found
in stdout gefunden werden.Auf meinem System
lzma test.tar
wird die Datei test.tar.lzma mit 106'3175 Byte (1,1 MB) erstelltquelle
Als Ergänzung zur Antwort von 'Mechanical Snail':
Selbst xz (oder lzma) findet keine Duplikate, wenn die Dateigröße der nicht komprimierten einzelnen Datei (oder genauer gesagt der Abstand zwischen den Duplikaten) die Wörterbuchgröße überschreitet. xz (oder lzma) reserviert auch bei höchster Einstellung
-9e
nur 64MB dafür.Glücklicherweise können Sie mit der Option Ihre eigene diktonische Größe angeben
--lzma2=dict=256MB
(nur--lzma1=dict=256MB
zulässig, wenn Sie den Alias lzma für den Befehl verwenden).Leider werden beim Überschreiben der Einstellungen mit benutzerdefinierten Komprimierungsketten, wie im obigen Beispiel angegeben, die Standardwerte für alle anderen Parameter nicht auf den gleichen Wert wie mit -9e festgelegt. Daher ist die Komprimierungsdichte für einzelne Dateien nicht so hoch.
quelle
gzip ohne Befehlszeilenschalter verwendet den niedrigstmöglichen Algorithmus für die Komprimierung.
Versuchen Sie es mit:
Sie sollten bessere Ergebnisse erzielen
quelle