Warum ist eine 7zipped-Datei größer als die RAW-Datei? [Duplikat]

37

Mögliches Duplizieren:
Warum komprimiert die ZIP-Komprimierung nichts?

Ich habe versucht, eine .exe-Datei zu komprimieren, aber sie wurde tatsächlich größer.

Bildbeschreibung hier eingeben

Ist das das erwartete Ergebnis?

IMB
quelle
3
Ja, es ist das erwartete Ergebnis. Warum? Denn wenn etwas bereits komprimiert ist (= den kleineren möglichen Platz nutzt), kann es nicht weiter komprimiert werden.
Woliveirajr
4
Nur um es allen anderen hinzuzufügen - da es sich bei dieser exe-Datei speziell um ein Installationsprogramm handelt, handelt es sich bei dem größten Teil des Inhalts wahrscheinlich um ein zip- oder cab-Archiv. Sie würden nicht die gleichen Ergebnisse von einer normalen Exe-Datei erhalten (aber die meisten normalen Exe-Dateien werden nicht 145 Megabyte sein)
Random832
1
Erläuterung nur unter Verwendung der Basislogik: Die Komprimierung findet für eine Rohdatei eine UNIQUE-komprimierte Datei und für eine komprimierte Datei eine UNIQUE-Rohdatei (unkomprimiert). Stellen Sie sich vor, Sie haben 8-Bit-Dateien und möchten diese in 5-Bit-Dateien komprimieren. Es gibt 256 eindeutige 8-Bit-Dateien, aber nur 32 eindeutige 5-Bit-Dateien (!). Daher müssen einige 8-Bit-Dateien in dieselbe 5-Bit-Datei (!) Komprimiert werden. Und wenn 2 verschiedene Rohdateien in dieselbe ZIP-Datei komprimiert wurden, welche möchten Sie nach der Dekomprimierung erhalten? Für jede Methode des Zippens, wenn es Dateien gibt, die nach dem Zippen kleiner werden, müssen es Dateien geben, die größer werden (!)
Ivan Kuckir

Antworten:

78

Es kommt auf ein Konzept namens Entropie . Siehe Wikipedia .

Die Grundidee ist , dass, wenn eine Kompressionsoperation existiert, der konnte immer eine Datei kleiner, dann Logik diktiert, die den Betrieb der Kompressions machen der Lage wäre , eine beliebige Datei auf 0 Byte zu reduzieren und trotzdem alle Daten behalten. Das ist aber absurd , weil wir wissen, dass 0 Bytes überhaupt keine Informationen übermitteln können. Wir haben also gerade bewiesen, dass es keinen Komprimierungsalgorithmus geben kann, der seine Eingabe immer kleiner macht, da in diesem Fall Informationen in 0 Bytes gespeichert werden könnten - 0 Bytes implizieren jedoch das Fehlen von Informationen. t gleichzeitig keine Informationen und alle Informationen. Daher ist es absurd.

Aufgrund dieses theoretischen Konzepts wird jedes Komprimierungsprogramm, das Sie jemals verwenden , die Größe einiger Eingaben erhöhen (oder bestenfalls die gleiche Größe beibehalten) . Das heißt, für jeden von Ihnen entworfenen oder verwendeten Komprimierungsalgorithmus gibt es bestimmte Eingaben, die kleiner ausfallen, und einige, die dies nicht tun.

Bereits komprimierte Daten sind im Allgemeinen ein schrecklicher Kandidat für eine weitere Komprimierung, da die meisten verlustfreien Komprimierungsalgorithmen auf denselben theoretischen Prinzipien beruhen. Es ist möglich, schlecht komprimierte Daten noch weiter zu komprimieren. Dies ist jedoch weniger effizient, als es einfach mit dem besten verfügbaren Algorithmus aus den ursprünglichen Daten zu komprimieren.

Wenn Sie beispielsweise eine Textdatei mit 100 MB haben und diese mit dem regulären Zip-Algorithmus komprimieren, wird sie möglicherweise auf 50 MB komprimiert. Wenn Sie die Zip-Datei dann mit LZMA2 komprimieren, können Sie sie möglicherweise auf 40 oder 45 MB reduzieren, da LZMA für die meisten komprimierbaren Daten eine höhere Komprimierungsrate aufweist als Zip. Es liegt also nahe, dass es auch Zip-Daten komprimieren kann, da Zip die gesamte Entropie nicht vollständig heraussaugt. Wenn Sie den Zip-Container jedoch vollständig entfernen, können Sie ihn möglicherweise noch verkleinern, indem Sie den Rohtext mit LZMA2 komprimieren, was möglicherweise eine Größe in der Größenordnung von 30 bis 35 MB ergibt (dies sind nur "Luftzahlen", um das Konzept zu veranschaulichen). .

Im Fall der Binärdatei, die Sie komprimieren möchten, ist sie größer, da das 7-Zip-Dateiformat eine eigene interne Struktur erstellen und die Daten der bereits komprimierten ausführbaren Datei in das 7-Zip-Format packen muss. Dies enthält Dinge wie ein Wörterbuch, einen Datei-Header und so weiter. Diese zusätzlichen Daten werden in der Regel durch die Einsparungen beim Komprimieren der Daten selbst mehr als ausgeglichen. Es scheint jedoch, dass die ausführbare Datei, die Sie komprimieren möchten, bereits mit einer Form von LZMA komprimiert ist. Andernfalls würde die Größe der ausführbaren Datei wahrscheinlich verringert oder nur geringfügig erhöht, anstatt sie um 2 MB zu erhöhen (was sehr viel ist).

allquixotic
quelle
Übrigens ist der wichtigste Teil für die Beantwortung dieser Frage ganz am Ende: "Dies enthält Dinge wie ein Wörterbuch, einen Dateikopf und so weiter. Diese zusätzlichen Daten werden normalerweise durch die Einsparungen beim Komprimieren der Daten selbst mehr als ausgeglichen, aber es scheint, dass die ausführbare Datei, die Sie zu komprimieren versuchen, bereits mit irgendeiner Form von LZMA komprimiert ist "
jhocking
6
@jhocking: Nein, der wichtigste Teil liegt in der Mitte: "Jedes Komprimierungsprogramm, das Sie jemals verwenden, wird die Größe von ... einigen Eingaben erhöhen." Das 7zip-Dateiformat hat ein Wörterbuch / Datei-Header / etc, aber selbst wenn 7zip einen Algorithmus verwendet, der keines dieser Dinge hat, können wir dennoch garantieren, dass einige (in der Tat die meisten) Eingänge Ausgänge haben, die es sind mindestens so groß wie die Eingaben selbst. Dies ist eine grundlegende Tatsache der Informationstheorie und hat nichts mit Datei-Headern zu tun.
BlueRaja - Danny Pflughoeft
2
@Mehrdad Sicher: Schreiben Sie einfach einen "Komprimierungs" -Algorithmus, der immer die ursprüngliche Eingabe zurückgibt. Dort; getan. : P ... Abgesehen davon, nein - jeder Komprimierungsalgorithmus, der überhaupt ein Algorithmus ist, wird einige Metadaten haben, auch wenn es nur ein Bit am Anfang der Datei ist, das angibt, ob die Datei komprimiert ist oder nicht (0 == unkomprimiert, 1 == komprimiert). Wenn Sie den Inhalt der Datei AT ALL ändern möchten , benötigen Sie einige Metadaten. Wenn Sie den Inhalt ändern, werden einige Eingaben größer.
Allquixotic
1
Lautete Ihre Frage jedoch "Gibt es einen Komprimierungsalgorithmus, der die Länge der Eingabe nicht über eine festgelegte Menge von Metadaten hinaus erhöht", lautet die Antwort: Ich weiß es nicht, aber es sollte theoretisch möglich sein, dies zu tun. Ganz einfach. Sie müssen lediglich ein Containerformat entwickeln, das entweder die Originaldatei oder einen komprimierten Datenstrom enthalten kann. Versuchen Sie dann beim Erstellen des Archivs, es zu komprimieren: Wenn die komprimierte Größe größer als die Eingabe ist, speichern Sie einfach die ursprüngliche Eingabe und packen Sie Ihre Metadaten ein. Die Dateigröße erhöht sich, aber wenn die Metadaten klein sind (Fortsetzung)
allquixotic
2
@Mehrdad: "Gibt es einen Komprimierungsalgorithmus (wie schlecht er auch sein mag), der die Länge einer Eingabe nicht erhöht? " - Die Antwort lautet "Nein". Es gibt 2^(n+1)-1mögliche Nachrichten mit einer Größe von n Bits oder weniger. Unser Algorithmus muss jedes dieser Elemente einer eindeutigen Ausgabe zuordnen. Wenn auch nur einer dieser Werte auf einen Wert mit weniger Bits abgebildet wird, muss zwangsläufig ein anderer Wert auf einen Wert mit mehr Bits abgebildet werden.
BlueRaja - Danny Pflughoeft
7

Die zugrunde liegenden Komprimierungsalgorithmen in 7z sind verlustfrei . Dies bedeutet, dass Sie eine Datei mehrere Male iterativ komprimieren und dekomprimieren können. Außerdem bleibt die Datei nach jeder Iteration exakt gleich.

Leider können Sie nicht erwarten, dass ein verlustfreier Komprimierungsalgorithmus viele Male angewendet wird, wobei immer ein positives Ergebnis erzielt wird. Es gibt eine strenge Grenze, über die nicht gesprungen werden kann. In etwa hängt diese Grenze davon ab, wie eng eine Eingabesequenz aus Zufallsdaten besteht. Vor allem werden verlustfreie Algorithmen für die Komprimierung von Dateien, die Übertragung von Internet-HTML-Daten, Sicherungen und andere Vorgänge verwendet, bei denen erwartet wird, dass eine Ausgabedatei in genau dieselbe ursprüngliche Eingabedatei dekomprimiert wird.

Im Gegensatz zur verlustfreien Komprimierung können Sie nach der Komprimierung mit verlustbehafteten (oder verlustbehafteten) Komprimierungsalgorithmen immer mit einer Verringerung der Dateigröße rechnen . Der Nachteil ist, dass Sie eine Originaldatei nach einer einzelnen Iteration von Komprimieren und Dekomprimieren nicht exakt wiederherstellen können . Diese Algorithmen sind am bekanntesten für Audio- / Video- / Bildübertragung und -speicherung.

bzip2 , LZMA , LZMA2 und andere vom 7z- Format verwendete Algorithmen sind alle verlustfrei . Daher wird es eine Grenze geben, nach der es nicht mehr komprimiert werden kann. Darüber hinaus sind ausführbare Abbilder (.exe) in der Regel stark komprimierte Dateien. 7zip bettet wie viele andere Komprimierungsprogramme einige Metadaten ein, wodurch die Ausgabedatei vergrößert werden kann.

Rätsel: Was wäre, wenn wir einen verlustfreien Algorithmus hätten, der die Dateigröße immer verringern kann?

In diesem Fall wird immer angezeigt, dass die komprimierte Datei kleiner als die Eingabedatei ist. Siehe einen Kommentar unten, warum es nicht möglich ist.

oleksii
quelle
5
Beweis durch Widerspruch. Hypothese: Angenommen, es ist immer möglich, eine Datei mit einem verlustfreien Algorithmus zu komprimieren. Schritt 1. Eine einzelne Komprimierung verkleinert eine Ausgabedatei um mindestens ein Bit. In diesem Fall erhalten wir nach einer Reihe von Iterationen eine Datei mit nur zwei Bits. Schritt 2 Mit der nächsten Iteration wird eine Datei mit einer Größe von 1 Bit erstellt. Schritt 3 Der Komprimierungsalgorithmus ist jedoch verlustfrei, was bedeutet, dass nur eine gültige Dekomprimierung zulässig ist. Natürlich können Sie nicht 2 Originalbits von 1 komprimierten Bit wiederherstellen - Sie müssen eine Vermutung anstellen. Der letzte Punkt verstößt gegen die Hypothese.
oleksii
Sie können keinen Algorithmus garantieren, der die Datei verkleinert, aber Sie können einen Algorithmus garantieren, der die Größe nicht erhöht, indem Sie in diesen Fällen keine "Komprimierung" anwenden. Um wirklich keine Dateigrößenerhöhung zu haben, müssten Sie dies außerhalb des Bandes angeben (z. B. im Dateinamen).
Jeteon
@Jeteon Ich bin nicht sicher, was Sie versuchen zu sagen.
oleksii
Ich habe nur hinzugefügt, dass Sie, da Sie immer die Option haben, die Eingabe nicht zu komprimieren, ein Komprimierungsprogramm haben können, das die Datei im schlimmsten Fall überhaupt nicht komprimiert. Wenn Sie feststellen, dass die komprimierte Version größer als die unkomprimierte Version ist, lassen Sie sie einfach. Sie müssten dann auch irgendwie angeben, dass dies der Fall ist, ohne die Größe der Ausgabe zu erhöhen, damit der Dekomprimierer weiß, dass die Datei nicht komprimiert wurde. Die einzige Möglichkeit, dies zu tun, ohne die Dateigröße zu erhöhen, besteht darin, den Dateinamen zu ändern.
Jeteon
@ Jeteon oh, ich verstehe. Ja, Sinn machen.
oleksii
6

Wenn die ursprüngliche ausführbare Datei bereits komprimiert war (oder stark komprimierte oder nicht komprimierbare Daten enthielt), wird sie durch Komprimieren vergrößert.

PhonicUK
quelle
2

Die meisten Kompressionsalgorithmen verwenden , was ist eine Symboltabelle genannt, basicly nur Peices der Datei , um sie als Elemente verwendet es CAN komprimieren. Dies erzeugt natürlich einen gewissen Overhead in der Datei, führt jedoch normalerweise zu einer viel kleineren Datei.

In bereits komprimierten Dateien werden immer noch eine Reihe von Symbolen erstellt, aber es gibt nur sehr wenige, die die Größe reduzieren können. In Ihrem Fall befindet sich die Symboltabelle der bereits komprimierten Datei wahrscheinlich in der Nähe von 2 MB oder wahrscheinlich mehr, wenn sie komprimiert werden konnte.

Chad Harrison
quelle
0

Die komprimierende Idee:

Die Komprimierungssoftware erstellt eine Liste von Dateien und beseitigt den doppelten Inhalt.

Wenn Sie bereits komprimierte Dateien komprimieren, werden Ihre komprimierten Dateien möglicherweise größer als das Original.

fromnaboo
quelle