Was ist das maximale Komprimierungsverhältnis von gzip?

50

Was ist die größte Größe, auf die ein Gzip (beispielsweise 10 KB) dekomprimiert werden kann?

Zombies
quelle

Antworten:

90

Es kommt sehr darauf an, welche Daten komprimiert werden. Ein schneller Test mit einer 1-GB-Datei voller Nullen ergibt eine komprimierte Größe von ~ 120 KB, sodass Ihre 10-KB-Datei möglicherweise auf ~ 85 MB erweitert werden kann.

Wenn die Daten zu Beginn nur eine geringe Redundanz aufweisen, enthält das Archiv Bilddateien in einem Format, das nativ komprimiert ist (gif, jpg, png, ...), fügt gzip möglicherweise überhaupt keine weitere Komprimierung hinzu. Für Binärdateien wie ausführbare Programme wird möglicherweise eine Komprimierung von bis zu 2: 1 angezeigt, für Nur-Text-, HTML- oder andere Markups ist 3: 1 oder 4: 1 oder mehr nicht unwahrscheinlich. In einigen Fällen wird möglicherweise 10: 1 angezeigt, aber die Anzeige von ~ 8700: 1 mit einer Datei, die mit einem einzelnen Symbol gefüllt ist, ist etwas, das Sie außerhalb ähnlich künstlicher Umstände nicht sehen werden.

Sie können überprüfen, wie viele Daten beim Entpacken einer gzip-Datei anfallen würden, ohne ihren unkomprimierten Inhalt tatsächlich auf die Festplatte zu schreiben. Dadurch gunzip -c file.gz | wc --byteswird die Datei dekomprimiert, die Ergebnisse jedoch nicht gespeichert. Stattdessen werden sie an diese Datei übergeben, wobei wcdie Anzahl der Bytes bei der Übergabe gezählt wird dann verwerfen sie. Wenn komprimierte Inhalte eine TAR - Datei enthält viele viele kleine Dateien sind vielleicht, dass deutlich mehr Speicherplatz finden benötigt , um das vollständige Archiv zu entpacken, aber in den meisten Fällen die Zählung von Rohrleitungen zurück gunzipAusgang durch wcwird so genau sein , wie Sie benötigen.

David Spillett
quelle
Ich habe gesehen, wie HTML auf das 10-fache erweitert wurde (natürlich waren x3 und x4 die häufigsten!) .... vielleicht eine Menge redundanter Daten für diejenigen, die + 8x explodierten. Ich denke, die fragliche Seite, die das tat, war eine PHP-Infoseite.
Zombies
Repetitive Markups lassen sich, wie in der Ausgabe von zu sehen phpinfo(), sehr gut komprimieren. Die technischen Informationen in dieser Ausgabe enthalten mehr direkte Wiederholungen als der durchschnittliche Teil der natürlichen Sprache. Die Alphabetverteilung ist wahrscheinlich weniger glatt, was dazu beitragen könnte, dass die Huffman-Stufe bessere Ergebnisse erzielt.
David Spillett
Diese Antwort berücksichtigt nicht absichtlich schädliche komprimierte Daten. Man kann eine bösartige Zip-Datei mit etwa 10 KB erstellen, die sich auf etwas mehr als 4 GB erweitern lässt.
David Schwartz
Zip-Bomben dieser Größenordnung basieren jedoch auf verschachtelten Archiven. Als Mensch, der die Datei entpackt, würde man schon bald etwas Merkwürdiges feststellen. Sie können jedoch als effektive DoS-Attacke gegen automatisierte Scanner (Mail-Dienste usw.) eingesetzt werden.
David Spillett
1
@DavidSpillett: Geschachtelte Reißverschlussbomben werden im Petabyte-Bereich größer. Davon spreche ich nicht. Sehen Sie sich nur eine Schicht einer typischen Reißverschlussbombe an.
David Schwartz
10

Normalerweise erhalten Sie nicht mehr als 95% Komprimierung (sodass 10 kB komprimierte Daten auf ~ 200 kB dekomprimiert werden), aber es gibt speziell gestaltete Dateien, die exponentiell expandieren. Achten Sie darauf 42.zip, dass es auf wenige Petabyte (bedeutungslose) Daten dekomprimiert.

Liori
quelle
4
Wikipedia sagt 42.zip wird „enthält fünf Schichten von verschachtelten Zip - Dateien in Gruppen von 16“, so dass kein gültiges Beispiel für die Dekomprimierung ist (nur für rekursive Dekompression).
Tgr
5
Tatsächlich ist 42.zip speziell eine Gefahr für Tools, die automatisch rekursiv zip-Dateien scannen, z. B. Virenscanner.
Thomasrutter
4
Das ist zip, nicht gzip
BeniBela
8

Wörtlich zitiert von https://stackoverflow.com/a/16794960/293815

Das maximale Komprimierungsverhältnis des Deflate-Formats beträgt 1032: 1. Dies liegt daran, dass der längste Lauf, der codiert werden kann, 258 Byte beträgt. Für jeden solchen Lauf sind mindestens zwei Bits erforderlich (ein Bit für den Längencode und ein Bit für den Entfernungscode), daher können 4 · 258 = 1032 nicht komprimierte Bytes pro komprimiertem Byte codiert werden.

Sie können mehr Komprimierung erzielen, indem Sie das Ergebnis von gzip gzippen. Normalerweise verbessert das die Komprimierung nicht, aber für sehr lange Läufe kann es.

Übrigens ist der von deflate verwendete LZ77-Ansatz allgemeiner als die Lauflängencodierung. Anstelle von nur einer Länge wird ein Länge / Distanz-Paar verwendet. Dies ermöglicht das Kopieren eines Strings aus einiger Entfernung oder das Replizieren eines Bytes in Lauflänge für eine Entfernung von 1 oder das Replizieren von Dreifachen von Bytes mit einer Entfernung von 3 usw.

ioquatix
quelle
6

Das Kompressionsverhältnis eines Kompressionsalgorithmus hängt von den zu komprimierenden Daten ab (abgesehen von der Länge dieser Daten).

Hier ist eine Analyse bei MaximumCompression .
Schauen Sie sich eines der Beispiele an wie:

Zusammenfassung der Benchmark-Tests für die Komprimierung mehrerer Dateien

Dateityp: Mehrere Dateitypen (insgesamt 46)  
Anzahl der zu komprimierenden Dateien in diesem Test: 510  
Gesamtdateigröße (Byte): 316.355.757 
Durchschnittliche Dateigröße (Byte): 620.305
Größte Datei (Bytes): 18.403.071
Kleinste Datei (Bytes): 3.554
nik
quelle
4

Eine große Datei mit nur einem Symbol wird sehr gut komprimiert.

Aussenseiter
quelle
4

10 MB Nullen in der Datei, komprimieren Sie mit gzip -9 auf 10217. Das maximale Verhältnis scheint also etwa 1000x zu sein.

Nikos
quelle
1

Die Antwort auf Ihre Frage hängt von der Eingabe ab. Um Ihnen eine Vorstellung davon zu geben, wie die Komprimierung durchgeführt wird, sehen Sie sich diese sechs Minuten langen Videos an.

https://www.youtube.com/watch?v=ZdooBTdW5bM

Was Sie daraus ziehen sollten, ist, dass die Komprimierungsrate von der Häufigkeit der einzelnen Zeichen abhängt, es gibt also keine generelle maximale Rate, sie hängt von der Eingabe ab, für englischen Text sind es ungefähr 65 Prozent.

brunsgaard
quelle
1
Willkommen bei Super User! Bitte zitieren Sie die wesentlichen Teile der Antwort aus dem / den Verweis (en), da die Antwort ungültig werden kann, wenn sich die verlinkte (n) Seite (n) ändern.
DavidPostill
Es wäre genauer zu sagen, "Häufigkeit der einzelnen Zeichenfolgen" anstatt "Häufigkeit der einzelnen Zeichen"
JoelFan