Possibile duplicato:
perché la compressione ZIP non comprime nulla?
Ho provato a decomprimere un file .exe ma in realtà è diventato più grande.
È questo il risultato atteso?
Possibile duplicato:
perché la compressione ZIP non comprime nulla?
Ho provato a decomprimere un file .exe ma in realtà è diventato più grande.
È questo il risultato atteso?
Risposte:
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).
2^(n+1)-1
possibili 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.
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.
In questo caso, vedrai sempre che il file compresso è più piccolo del file di input. Guarda un commento qui sotto perché non è possibile.
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.