Kann das gemeinsame Teern mehrerer Dateien die Komprimierung mit den Standardwerkzeugen verbessern, z. B. gzip, bzip2, xz?
Ich habe lange gedacht, dass dies der Fall ist, habe es aber nie getestet. Wenn wir 2 Kopien derselben 20-MB-Datei mit zufälligen Bytes haben, die zusammen geteert sind, könnte ein cleveres Komprimierungsprogramm, das dies erkennt, den gesamten Tarball auf fast 20 MB komprimieren.
Ich habe gerade dieses Experiment mit gzip, bzip2 und xz versucht, um 1) eine Datei mit zufälligen Bytes, 2) einen Tarball mit zwei Kopien dieser Datei und 3) eine Katze mit zwei Kopien dieser Datei zu komprimieren. In allen Fällen hat die Komprimierung die Dateigröße nicht verringert. Dies wird für Fall 1 erwartet, aber für die Fälle 2 und 3 ist das optimale Ergebnis, dass eine 40-MB-Datei auf fast 20 MB verkleinert werden kann. Das ist eine schwierige Erkenntnis für ein Komprimierungsprogramm, insbesondere weil die Redundanz weit entfernt ist. Ich würde also kein perfektes Ergebnis erwarten, aber ich hatte immer noch gedacht, dass es eine gewisse Komprimierung geben würde.
Prüfung:
dd if=/dev/urandom of=random1.txt bs=1M count=20
cp random1.txt random2.txt
cat random1.txt random2.txt > random_cat.txt
tar -cf randoms.tar random1.txt random2.txt
gzip -k random* &
bzip2 -k random* &
xz -k random* &
wait
du -sh random*
Ergebnis:
20+0 records in
20+0 records out
20971520 bytes (21 MB) copied, 1.40937 s, 14.9 MB/s
[1] Done gzip -k random*
[2]- Done bzip2 -k random*
[3]+ Done xz -k random*
20M random1.txt
21M random1.txt.bz2
21M random1.txt.gz
21M random1.txt.xz
20M random2.txt
21M random2.txt.bz2
21M random2.txt.gz
21M random2.txt.xz
40M random_cat.txt
41M random_cat.txt.bz2
41M random_cat.txt.gz
41M random_cat.txt.xz
41M randoms.tar
41M randoms.tar.bz2
41M randoms.tar.gz
41M randoms.tar.xz
Ist das allgemein das, was ich erwarten sollte?
Gibt es hier eine Möglichkeit, die Komprimierung zu verbessern?
quelle
Antworten:
Sie haben es mit der "Blockgröße" des Kompressors zu tun. Die meisten Komprimierungsprogramme unterteilen die Eingabe in Blöcke und komprimieren jeden Block. Es scheint, dass die bzip-Blockgröße nur bis zu 900 KB beträgt, sodass kein Muster angezeigt wird, dessen Wiederholung länger als 900 KB dauert.
http://www.bzip.org/1.0.3/html/memory-management.html
gzip scheint 32K-Blöcke zu verwenden.
Mit xz hast du aber Glück! Von der Manpage:
"xz -8" findet also bis zu 32 MB Muster und "xz -9" bis zu 64 MB Muster. Aber Vorsicht, wie viel RAM benötigt wird, um die Komprimierung durchzuführen (und zu dekomprimieren) ...
quelle
Der von Ihnen ausgewählte zufällige Dateiinhalt ist kein gutes Beispiel - die komprimierten Tarfiles sind größer als die Originale. Sie sehen dasselbe bei Dateien in bereits komprimierten Formaten (z. B. viele Bild- / Audio- / Videoformate).
Das Zusammenstellen mehrerer Dateien mit komprimierbarem Inhalt führt jedoch in der Regel zu einer geringeren Gesamtgröße der Tarfiles als das separate Tarieren, insbesondere wenn die Inhalte ähnlich sind (z. B. Protokolldateien aus demselben Programm). Der Grund dafür ist, dass einige der Komprimierungsoffsetdaten pro Datei (wie Musterarrays für einige Komprimierungsalgorithmen) von allen Dateien in derselben Tarfile gemeinsam genutzt werden können.
quelle
Wie bereits angegeben:
Ein besserer Testfall könnte folgender sein:
(Hinweis: Ich hoffe, es gibt keine Reittiere unter
/usr
!)Sie können
tar -jcf
stattdessen für die xz-Komprimierung verwenden.Wenn nun
test2.tar.gz
kleiner als test1.tar.gz ist, ist der Test erfolgreich (dh Teerdateien, dann ist das Komprimieren besser als das Komprimieren und dann das Teern). Ich vermute, es wird für viele (dh Tausende) Dateien sein. Der Nachteil ist, dass die Ausführung möglicherweise länger dauert und viel mehr Speicherplatz benötigt, da zuerst die gesamte TAR-Datei erstellt und dann komprimiert werden muss. Aus diesem Grund wird stattdessen häufig die erste Methode verwendet, da jede Datei im laufenden Betrieb komprimiert wird, auch wenn sie möglicherweise keinen so kleinen Tarball enthält.In unserer Offsite-Sicherung sichern wir beispielsweise normalerweise 4.000.000 Dateien mit einer Gesamtgröße von 2 TB. Die erste Methode ist also viel schneller und erfordert keine zusätzlichen 2 TB Festplatte.
quelle
-z
komprimieren das Archiv (dh der Teer)? Normalerweiseczf
endet der Ausgabedateiname mit .tar.gz, um dies hervorzuheben.