Ich habe Hunderte von ähnlich großen Dateien (jeweils 30 Megabyte), die ich komprimieren möchte. Jedes Dateipaar enthält 99% der gleichen Daten (weniger als 1% Unterschied), daher erwarte ich nicht mehr als 40-50 Megabyte Archiv.
Einzelne Datei kann von 30 MB auf 13 bis 15 MB komprimiert wird (mit xz -1
, gz -1
, bzip2 -1
), aber wenn zwei Komprimieren oder mehr Dateien mag ich Archiv haben , mit der Größe , 13-15MB + N*0.3MB
wobei N Anzahl der Dateien ist.
Wenn ich tar
(um ein solides Archiv zu erstellen) und xz -6
(um das Komprimierungswörterbuch so zu definieren, dass es größer als eine Datei ist - Aktualisieren - das war nicht genug! ) Verwende , habe ich immer noch ein Archiv mit Größe N*13MB
.
Ich denke, dass beide gzip
und bzip2
mir nicht helfen werden, da sie weniger als 1 MB Wörterbuch haben und mein Teer-Stream alle 30 MB Wiederholungen hat.
Wie kann ich mein Problem in modernem Linux mit Standardwerkzeugen archivieren?
Ist es möglich, xz
die Komprimierung schnell einzustellen, aber ein Wörterbuch zu verwenden, das größer als 30-60 MB ist?
Update : Hab den Trick mit gemacht tar c input_directory | xz --lzma2=dict=128M,mode=fast,mf=hc4 --memory=2G > compressed.tar.xz
. Nicht sicher notwendig , von mf=hc4
und --memory=2G
Optionen; aber dict=128M
das Wörterbuch gesetzt groß genug (größer als eine Datei) zu sein, und mode=fast
machen den Prozess etwas schneller als -e
.
quelle
xz -1 --memory=2G
hat nicht geholfen, getestet an 2 und 4 Dateien aus dem Set.Antworten:
Angesichts Ihrer Angaben gehe ich davon aus, dass Sie überprüft haben, dass Ihre Dateien tatsächlich 99% der Daten gemeinsam haben, wobei ein zusammenhängender (oder fast zusammenhängender) Unterschied von 1% vorliegt.
Zuerst sollten Sie tar verwenden, um ein Archiv mit Ihren Dateien darin zu erstellen. Für Tests würde ich eine .tar-Datei mit 10 Dateien und einer Größe von 300 MB erstellen.
Dann müssen Sie mit xz festlegen, dass das Wörterbuch größer als die Größe einer Datei ist. Da Sie nicht sagen, ob Sie Speicherbeschränkungen haben, würde ich mit xz -9 gehen. Es hat keinen Sinn, nicht den gesamten verfügbaren Speicher zu nutzen.
Ich würde auch das --extreme-Preset verwenden, um zu testen, ob es einen Unterschied macht.
Wörterbuchgröße
In einer verfügbaren Dokumentation - Site - heißt es, dass die Größe des Wörterbuchs in etwa der Speicherauslastung des Dekomprimierers entspricht. Und der Parameter -1 bedeutet ein Diktat von 1 MB, -6 bedeutet 10 MB (oder 8 MB in einem anderen Teil desselben Handbuchs). Das ist der Grund, warum Sie keinen Vorteil erzielen, wenn Sie diese Dateien zusammenfassen. Die Verwendung von -9 würde den Dekompensator (und damit das Wörterbuch) auf 64 MiB bringen, und ich denke, das ist, was Sie wollten.
Bearbeiten
Eine andere Möglichkeit wäre die Verwendung eines anderen Kompressors. Ich würde mit 7zip arbeiten, aber diese Dateien zuerst tarieren und dann 7zipen.
Abhängig vom Inhalt Ihrer Dateien könnten Sie 7zip mit der PPM-D-Methode verwenden (anstelle von LZMA oder LZMA2, das ist die Standardeinstellung und die gleiche, die von xz verwendet wird).
Nicht gut: Zip (dict = 32 kB), Bzip (dict = 900 kB).
quelle
-1
oder-9
voreingestellt, sondern angebendict=64MB
oderdict=128MB
und setzenmode=fast
?xz --lzma2=dict=128M,mode=fast,mf=hc4 --memory=2G
ich 250 Dateien (7,5 GB) auf 18 MB tar.xz-Archiv komprimieren.Wenn sie wirklich zu 99% ähnlich sind, sollten Sie in der Lage sein, bsdiff oder einen ähnlichen Algorithmus zu verwenden, um die Unterschiede zwischen den Dateien zu berechnen. Ist der Unterschied kumulativ (dh, jede Datei unterscheidet sich ein wenig mehr von der ersten) oder ist der Unterschied zwischen zwei Dateien ziemlich gleich?
Wenn es nicht kumulativ ist, sollten Sie in der Lage sein:
bsdiff
die Baseline - Datei jede zusätzliche Datei zu vergleichenxz
über die Ergebnisse (die Basislinie + die Unterschiede).Das Ergebnis sollte viel kleiner sein als nur
xz
das gesamte Archiv.Sie können dann die ursprünglichen Dateien "rekonstruieren", indem Sie das Diff oben auf der Grundlinie "anwenden", um alle anderen Dateien zu erhalten.
quelle
bsdiff
Algorithmus sein. Versuche es.tar c directory|xz --lzma2=dict=128M,mode=fast
und Eingabedateien gelöscht. Eigentlich waren meine Eingabedateien Text, daher kann ich stattdessen auch diff verwendenbsdiff
(was auf meinem PC nicht installiert ist).Sie (I) können tar mit einigen Archiven verwenden, die zur Erkennung von Mustern mit großer Reichweite fähig sind, z. B. rzip oder lrzip ( Readme ). Beide verwenden die Erkennung / Deduplizierung von Redundanzen über große Entfernungen, dann verwendet rzip bzip2 und lrzip xz (lzma) / ZPAQ:
lrzip hat einen größeren Puffer und verwendet nach der Deduplizierung möglicherweise viele Komprimierungsalgorithmen (sehr schnell, schnell, gut und einer der besten - ZPAQ):
Eine andere Möglichkeit ist die Verwendung von bup - backup mit Deduplizierung auf Block- / Segmentebene, basierend auf git packfile:
quelle