Perché un file 7zipped è più grande del file raw? [duplicare]


37

Possibile duplicato:
perché la compressione ZIP non comprime nulla?

Ho provato a decomprimere un file .exe ma in realtà è diventato più grande.

inserisci qui la descrizione dell'immagine

È questo il risultato atteso?


3
Sì, è il risultato atteso. Perché? Perché quando qualcosa è già compresso (= usando lo spazio più piccolo possibile), non può essere ulteriormente compresso.
woliveirajr,

4
Solo per aggiungere a tutti gli altri - poiché questo file exe è specificamente un programma di installazione, la maggior parte del suo contenuto è probabilmente un archivio zip o cab. Non
otterresti

1
Spiegazione usando solo la logica di base: La compressione trova per un file raw un file zippato UNIQUE e per il file zippato file originale grezzo (non compresso) UNIQUE. Immagina di avere file a 8 bit e di comprimerli in file a 5 bit. Esistono 256 file univoci a 8 bit, ma solo 32 file univoci a 5 bit (!) Quindi alcuni file a 8 bit devono essere compressi nello stesso file a 5 bit (!). E se 2 diversi file raw vengono compressi nello stesso file ZIP, quale vuoi ottenere dopo la decompressione? Per qualsiasi metodo di compressione, se esistono file che diventano più piccoli dopo la compressione, devono esistere file che diventano più grandi (!)
Ivan Kuckir,

Risposte:


78

Si riduce a un concetto chiamato entropia . Vedi Wikipedia .

L'idea di base è che, se esistesse un'operazione di compressione che potrebbe sempre ridurre un file, la logica impone che tale operazione di compressione sarebbe in grado di ridurre qualsiasi file a 0 byte e conservare comunque tutti i dati. Ma questo è assurdo , perché sappiamo che 0 byte non sono in grado di trasmettere alcuna informazione. Quindi abbiamo appena dimostrato che non può esistere un algoritmo di compressione che riduca sempre il suo input, perché in tal caso, qualsiasi informazione potrebbe essere memorizzata in 0 byte - ma 0 byte implica l' assenza di informazioni, quindi puoi " contemporaneamente non hanno informazioni e tutte le informazioni. Quindi, è assurdo.

Grazie a questo concetto teorico, ogni programma di compressione che userete aumenterà la dimensione di (o nella migliore delle ipotesi, manterrà la stessa dimensione di) alcuni input. Cioè, per qualsiasi algoritmo di compressione che progetti o utilizzi, ci saranno alcuni input che risulteranno più piccoli e altri che non lo faranno.

I dati già compressi sono generalmente un terribile candidato per un'ulteriore compressione, poiché la maggior parte degli algoritmi di compressione senza perdita di dati si basa sugli stessi principi teorici. Si è possibile comprimere ulteriormente dati mal compressi; ma questo è meno efficiente del semplice comprimerlo con l'algoritmo migliore disponibile dai dati originali per cominciare.

Ad esempio, se si dispone di un file di testo da 100 MB e lo si comprime utilizzando l'algoritmo Zip normale, è possibile comprimerlo fino a 50 MB. Se quindi comprimi il file Zip con LZMA2, potresti ridurlo a 40 o 45 MB, poiché LZMA ha un rapporto di compressione più elevato per la maggior parte dei dati comprimibili rispetto a Zip. Quindi è ovvio che può anche comprimere i dati Zip, perché Zip non succhia completamente tutta l'entropia da esso. Ma se elimini del tutto il contenitore Zip, potresti essere in grado di ridurlo ulteriormente comprimendo il testo non elaborato con LZMA2, producendo potenzialmente qualcosa nell'ordine di 30 - 35 MB (questi sono solo "numeri d'aria" per illustrare il concetto) .

Nel caso di quel binario che stai cercando di comprimere, è più grande perché il formato di file 7-Zip deve creare una propria struttura interna e comprimere i dati dell'eseguibile già compresso nel formato 7-Zip. Questo contiene cose come un dizionario, un'intestazione di file e così via. Questi dati extra sono generalmente più che compensati dai risparmi nel comprimere i dati stessi, ma sembra che l'eseguibile che stai cercando di comprimere sia già compresso con una qualche forma di LZMA; altrimenti, probabilmente ridurrebbe la dimensione dell'eseguibile o aumenterebbe leggermente, piuttosto che aumentarla di 2 MB (che è molto).


tra l'altro la parte più importante per rispondere a questa domanda è proprio alla fine: "Questo contiene cose come un dizionario, un'intestazione di file e così via. Questi dati extra sono generalmente più che compensati dai risparmi di comprimere i dati stessi, ma esso sembra che l'eseguibile che stai cercando di comprimere sia già compresso con una qualche forma di LZMA "
jhocking

6
@jhocking: No, la parte più importante è verso il centro: "Ogni programma di compressione che usi mai aumenterà la dimensione di ... alcuni input." Il formato di file di 7zip ha un dizionario / intestazione di file / etc, ma anche se 7zip utilizzava un algoritmo che non aveva nessuna di queste cose, siamo comunque garantiti che alcuni input (in effetti, la maggior parte) avranno output che sono come grande o più grande degli input stessi. Questo è un dato di base della teoria dell'informazione e non ha nulla a che fare con le intestazioni dei file.
BlueRaja - Danny Pflughoeft,

2
@Mehrdad Certo: basta scrivere un algoritmo di "compressione" che restituisca sempre l'input originale. Là; fatto. : P ... A parte questo, no - qualsiasi algoritmo di compressione che è affatto un algoritmo avrà alcuni metadati, anche se è solo un bit all'inizio del file che indica se il file è compresso o meno (0 == non compresso, 1 == compresso). Se hai intenzione di modificare il contenuto del file AT ALL , hai bisogno di alcuni metadati. E se stai modificando i contenuti, ingrandirai alcuni input.
allquixotic,

1
Tuttavia, se la tua domanda era "Esiste un algoritmo di compressione che non aumenta la lunghezza dell'input oltre una quantità fissa di metadati", la risposta è: non lo so, ma dovrebbe essere teoricamente possibile farlo. Facile, in effetti. Tutto quello che dovete fare è sviluppare un formato contenitore che può sia contenere il file originale, o di un flusso di dati compressi. Quindi, quando si crea l'archivio, provare a comprimere: se la dimensione compressa è maggiore dell'input, è sufficiente memorizzare l'input originale e comprimere i metadati davanti. Le dimensioni del file aumenteranno, ma se i metadati sono piccoli (continua)
allquixotic il

2
@Mehrdad: "Esiste un algoritmo di compressione (per quanto scarso) che non aumenta la lunghezza di alcun input? " - La risposta è no. Vi sono 2^(n+1)-1possibili messaggi di dimensioni n-bit o inferiori. Il nostro algoritmo deve mappare ognuno di questi su un output unico . Se anche uno di questi viene mappato su un valore con meno bit, un altro valore deve necessariamente essere mappato su un valore con più bit.
BlueRaja - Danny Pflughoeft,

7

Gli algoritmi di compressione sottostanti utilizzati in 7z sono senza perdita . Ciò significa che è possibile comprimere e decomprimere ripetutamente un file più volte. Inoltre, dopo ogni iterazione il file rimarrà esattamente lo stesso.

Sfortunatamente, non ci si può aspettare che un algoritmo di compressione senza perdita venga applicato molte volte con un risultato sempre positivo. C'è un limite rigoroso sul quale non può saltare. All'incirca, questo limite dipende dalla precisione con cui una sequenza di input contiene dati casuali. Soprattutto, gli algoritmi senza perdita di dati vengono utilizzati per la compressione dei file, i trasferimenti di dati HTML su Internet, i backup e altre operazioni che prevedono che un file di output venga decompresso esattamente nello stesso file di input originale.

Contrariamente alla compressione senza perdita , ci si può aspettare una riduzione della dimensione del file dopo la compressione con algoritmi di compressione con perdita (o con perdita) . Il lato negativo è che non è possibile ripristinare esattamente un file originale dopo una singola iterazione di compressione-decompressione. Questi algoritmi sono più famosi per le trasmissioni e l'archiviazione di audio / video / immagini.

bzip2 , LZMA , LZMA2 e altri algoritmi utilizzati dal formato 7z sono tutti senza perdita di dati . Pertanto ci sarà un limite dopo il quale non potrà più comprimere. Inoltre, le immagini eseguibili (.exe) sono generalmente file altamente compressi. 7zip come molti altri strumenti di compressione incorpora alcuni metadati, che in effetti possono ingrandire il file di output.

Rompicapo: e se avessimo un algoritmo lossless che può sempre ridurre le dimensioni di un file?

In questo caso, vedrai sempre che il file compresso è più piccolo del file di input. Guarda un commento qui sotto perché non è possibile.


5
Prova per contadiction. Ipotesi: supponiamo che sia sempre possibile comprimere un file con un algoritmo lossless. Passo 1. La compressione singola rende un file di output più piccolo di almeno un bit. In tal caso, dopo una serie di iterazioni finiremo con un file che ha solo due bit. Passaggio 2 L'iterazione successiva crea un file della dimensione di 1 bit. Passaggio 3 Ma gli algoritmi di compressione sono senza perdita, il che significa che è consentita una sola decompressione valida. Chiaramente non puoi ripristinare 2 bit originali da 1 bit compresso - dovrai fare un'ipotesi. L'ultimo punto viola l'ipotesi.
oleksii,

Non è possibile garantire un algoritmo che riduca le dimensioni del file, ma è possibile garantirne uno che non aumenti le dimensioni senza applicare "compressione" in questi casi. Per non avere realmente alcun aumento delle dimensioni del file, dovresti indicarlo fuori banda (ad es. Nel nome del file).
jeteon,

@jeteon Non sono sicuro di quello che stai cercando di dire.
oleksii,

Stavo solo aggiungendo che dato che hai sempre la possibilità di non comprimere l'input, puoi avere un programma di compressione che non comprimerà affatto il file nel peggiore dei casi. Fondamentalmente, se determini che la versione compressa è più grande della versione non compressa, la lasci. Dovresti quindi indicare in qualche modo che questo è il caso senza aggiungere alla dimensione dell'output in modo che il decompressore sappia che il file non è stato compresso. L'unico modo per farlo senza aumentare le dimensioni del file è fare qualcosa come cambiare il nome del file.
jeteon,

@jeteon oh, capisco. Sì, ha senso.
oleksii,

6

Se l'eseguibile originale era già compresso (o conteneva dati fortemente compressi o dati non comprimibili), la compressione aumenterà le dimensioni.


2

La maggior parte degli algoritmi di compressione utilizza quella che viene chiamata una tabella dei simboli, in pratica solo parti del file che utilizza come elementi che PUO ' comprimere. Questo, ovviamente, crea un certo sovraccarico nel file ma di solito risulta un file molto più piccolo.

Nei file già compressi, crea ancora un set di simboli, ma c'è molto poco che può essere ridotto la dimensione. Nel tuo caso, la tabella dei simboli del file già compresso è probabilmente nelle vicinanze di 2 MB o probabilmente più se è riuscito a fare un po 'di compressione.


0

l'ideea di compressione:

il software di compressione crea un elenco di file ed elimina il contenuto duplicato.

quando si comprimono file già compressi, è possibile che i file compressi siano più grandi dell'originale.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.