Was macht das Kombinieren von Komprimierungsmethoden in 7z tatsächlich?

11

Mit dem 7z-Befehlszeilentool können Sie mehrere Komprimierungsmethoden angeben , z.

# 7-zip archive type, strongest (9) compression, methods PPMd, BCJ2, LZMA2
$ 7z a -t7z -mx=9 -m0=PPMd -m1=BCJ2 -m2=LZMA2 myarchive.7z somefile.xml

Alle Methoden werden auf irgendeine Weise verwendet oder zumindest in den Metadaten angegeben:

$ 7z l -slt myarchive.7z

7-Zip [64] 9.22 beta  Copyright (c) 1999-2011 Igor Pavlov  2011-04-18

Listing archive: myarchive.
7z

--
Path = myarchive.7z
Type = 7z
Method = LZMA2 PPMD BCJ2
[..]

----------
Path = somefile.xml
[..]
Method = PPMD:o32:mem192m BCJ2 LZMA2:48m
Block = 0

Es scheint nicht , dass die Datei mit allen drei Methoden ausgeführt wird, um die beste auszuwählen. Vielmehr wird anscheinend immer die erste ausgewählt, da eine Änderung der Reihenfolge der Methode die Dateigröße erheblich beeinflusst.

Selbst wenn ich mehrere Dateien hinzufüge, z. B. eine XML-Datei (PPMd liefert die beste Komprimierung) und eine Binärdatei (LZMA2), werden alle Methoden für beide Dateien aufgelistet und scheinen nicht dynamisch pro Datei zu wechseln.

In der Dokumentation heißt es ausdrücklich: "Sie können eine beliebige Anzahl von Methoden verwenden.", Es wird jedoch nicht angegeben, warum .

Was ich erreichen möchte, ist ein Archiv pro Datei "Probieren Sie mehrere Methoden aus, wählen Sie die beste aus". Ich kann dies natürlich manuell mit ein wenig Skripterstellung erreichen, aber vermutlich sollten Verkettungskomprimierungsmethoden genau das tun?

Sören Kuklau
quelle
Durch Ändern der Reihenfolge der Komprimierungsmethoden sollte die komprimierte Größe geändert werden, auch wenn alle Methoden nacheinander angewendet werden. Die meiste Komprimierung erfolgt normalerweise bei der ersten angewendeten Methode. Das Ergebnis davon weist typischerweise eine hohe Entropie auf, so dass es schwierig ist, es weiter zu komprimieren. Es gibt Ausnahmen für Transformationen, von denen nicht erwartet wird, dass sie die Daten selbst komprimieren, die jedoch so komprimiert werden, dass sie komprimierbarer sind - z. B. hat die Sequenz 1, 2, 3, 4, 5 keine Wiederholung von Werten, aber Wiederholung von Unterschieden Eine Delta-Transformation verbessert die Kompressibilität. Darum geht es in der Antwort von Daniel B.
Steve314
Ich weiß allerdings nicht genau, was 7zip macht - nur einen Kommentar zu Ihrer Logik "Die Änderung der Reihenfolge der Methode wirkt sich erheblich auf die Dateigröße aus".
Steve314

Antworten:

5

Im Allgemeinen können komprimierte Daten nicht (weiter) effizient komprimiert werden. Nachdem die erste Komprimierungsmethode angewendet wurde, kann die Dateigröße nicht wesentlich verringert werden.

Dies -mN=Xdient hauptsächlich zur Angabe von Filtern (aus der Windows-Hilfedatei):

Unterstützte Filter:

Delta- Delta-Filter ("Es ist möglich, den Delta-Offset in Bytes festzulegen. Um beispielsweise 16-Bit-Stereo-WAV-Dateien zu komprimieren, können Sie" 0 = Delta: 4 "einstellen. Der Standard-Delta-Offset ist 1.")

BCJ- Konverter für ausführbare x86-Dateien

BCJ2- Konverter für ausführbare x86-Dateien (Version 2) („BCJ2 ist ein Verzweigungskonverter für ausführbare 32-Bit-x86-Dateien (Version 2). Er konvertiert einige Verzweigungsanweisungen, um die weitere Komprimierung zu erhöhen.“)

ARM- Konverter für ausführbare ARM-Dateien (Little Endian)

ARMT- Konverter für ausführbare ARM Thumb-Dateien (Little Endian)

IA64- Konverter für ausführbare IA-64-Dateien

PPC- Konverter für ausführbare PowerPC-Dateien (Big Endian)

SPARC- Konverter für ausführbare SPARC-Dateien

Ebenfalls aus der Hilfedatei, ein erweitertes Beispiel, das mehrere Ausgabestreams des BCJ2-Filters nutzt:

7z a -t7z archive.7z *.exe *.dll -m0=BCJ2 -m1=LZMA:d23 -m2=LZMA:d19 -m3=LZMA:d19      -mb0:1 -mb0s1:2 -mb0s2:3

Fügt dem Archiv archive.7z mit dem BCJ2-Konverter * .exe- und * .dll-Dateien hinzu, LZMA mit 8 MB Wörterbuch für Hauptausgabestream (s0) und LZMA mit 512 KB Wörterbuch für s1- und s2-Ausgabestreams von BCJ2.

Daniel B.
quelle
"Nachdem die erste Komprimierungsmethode angewendet wurde, kann die Dateigröße nicht wesentlich verringert werden." - Sicher. Meine Hoffnung war, dass durch die Angabe mehrerer Methoden jede angegebene Methode pro Datei ausprobiert und die effizienteste ausgewählt werden kann. Dies würde natürlich die Komprimierung erheblich verlangsamen.
Sören Kuklau
2

Es scheint, dass Sie Filter in einer Sequenz anwenden können.

Dieser Beitrag vom letzten Jahr hat eine schöne Erklärung:

Was bedeutet die Zahl nach dem 7-Zip-Schalter?

Mit dieser Nummer können Sie die Reihenfolge der Komprimierungsvorgänge festlegen, wenn Sie mehrere gleichzeitig verwenden.

Dies ist ein Beispiel aus der Dokumentation:

7z a a.7z *.exe *.dll -m0=BCJ2 -m1=LZMA:d25 -m2=LZMA:d19 -m3=LZMA:d19 -mb0:1 -mb0s1:2 -mb0s2:3

Fügt * .exe- und * .dll-Dateien zum Archivieren von a.7z mithilfe des BCJ2-Filters, LZMA mit 32 MB Wörterbuch für den Hauptausgabestream (s0) und LZMA mit 512 KB Wörterbuch für s1- und s2-Ausgabestreams von BCJ2 hinzu.

Die erste Komprimierung ist die niedrigste Zahl, die Null ist. In diesem Beispiel wird Null auf BCJ2 gesetzt. Dann kommt einer, der LZMA ist. Zwei und drei sind ebenfalls LZMA, verwenden jedoch unterschiedliche d-Parameter.

Die Option -mb wird verwendet, um die Ausgabe einer Komprimierung an die Eingabe einer anderen zu "binden". In diesem Beispiel hat BCJ2 einen Eingang und vier Ausgänge. Die Ausgabe Null geht an die Komprimierung Nummer eins. Ausgang eins geht an Komprimierung Nummer zwei. Ausgang zwei geht an Komprimierung Nummer drei. Ausgang drei ist nicht gebunden (da er nicht erneut komprimiert werden muss).

Marcelo
quelle