Qual è il rapporto di compressione massimo di gzip?


51

Qual è la dimensione massima a cui può essere decompresso un gzip (diciamo 10kb a titolo di esempio)?

Risposte:


91

Dipende molto dai dati compressi. Un test rapido con un file da 1 GB pieno di zeri fornisce una dimensione compressa di ~ 120 KB, quindi il tuo file da 10 KB potrebbe potenzialmente espandersi in ~ 85 MB.

Se i dati hanno una ridondanza ridotta per cominciare, ad esempio, l'archivio contiene file di immagini in un formato compresso in modo nativo (gif, jpg, png, ...), gzip potrebbe non aggiungere alcuna ulteriore compressione. Per i file binari come gli eseguibili del programma potresti vedere una compressione fino a 2: 1, per testo normale, HTML o altri markup 3: 1 o 4: 1 o più non è improbabile. In alcuni casi potresti vedere 10: 1 ma ~ 8700: 1 visto con un file riempito con un singolo simbolo è qualcosa che non vedrai al di fuori di circostanze analogamente artificiali.

Puoi controllare quanti dati sarebbero derivati ​​dalla decompressione di un file gzip, senza effettivamente scrivere il suo contenuto non compresso su disco, con gunzip -c file.gz | wc --bytes- questo decomprimerà il file ma non memorizzerà i risultati, invece passandoli ai wcquali conterrà il numero di byte mentre passano quindi scartali. Se il contenuto compresso è un file tar contenente molti piccoli file, potresti scoprire che è necessario molto più spazio su disco per decomprimere l'intero archivio, ma nella maggior parte dei casi, il conteggio restituito gunzipdall'output del piping wcsarà accurato quanto ti serve.


Ho visto HTML espandersi a 10x (ovviamente x3 e x4 erano i più comuni!) .... forse molti dati ridondanti per quelli che stavano esplodendo + 8x. Penso che la pagina in questione che stava facendo quella fosse una pagina di informazioni php.
Zombi,

Il markup ripetitivo, come si vede nell'output di phpinfo(), si comprime molto bene. Le informazioni tecniche in quell'output contengono una ripetizione più diretta rispetto alla porzione media del linguaggio naturale, e la distribuzione dell'alfabeto è probabilmente meno regolare, il che potrebbe aiutare lo stadio Huffman a ottenere risultati migliori.
David Spillett,

Questa risposta non tiene conto dei dati compressi intenzionalmente dannosi . Si può creare un file zip dannoso intorno a 10 KB che può espandersi a un po 'più di 4 GB.
David Schwartz,

Le bombe zip di quella scala si basano su archivi nidificati, quindi come un essere umano che disimballa il file noteresti qualcosa di strano in poco tempo. Tuttavia, possono essere utilizzati come un efficace attacco DoS contro scanner automatici (sui servizi di posta e così via).
David Spillett,

1
@DavidSpillett: le bombe con zip nidificate si espandono in dimensioni nell'intervallo petabyte. Non è di questo che sto parlando. Guarda anche solo un singolo strato di una tipica bomba con zip.
David Schwartz,

10

Di solito non si ottiene una compressione superiore al 95% (in modo che i dati compressi con gzip da 10 KB vengano decompressi a ~ 200 kB), ma esistono file appositamente predisposti che si espandono in modo esponenziale. Cerca 42.zip, si decomprime in pochi petabyte di dati (insignificanti).


4
Wikipedia afferma che 42.zip "contiene cinque strati di file zip nidificati in set di 16", quindi non è un esempio valido per la decompressione (solo per la decompressione ricorsiva).
Tgr

5
Infatti, 42.zip è specificamente un pericolo per gli strumenti che scansionano automaticamente i file zip in modo ricorsivo, ad esempio i programmi antivirus.
thomasrutter,

4
Questo è zip, non gzip
BeniBela,

8

Citato alla lettera da https://stackoverflow.com/a/16794960/293815

Il rapporto di compressione massimo del formato di deflazione è 1032: 1. Questo perché la corsa più lunga che può essere codificata è 258 byte. Sono necessari almeno due bit per ciascuna di queste corse (un bit per il codice di lunghezza e un bit per il codice di distanza), quindi 4 * 258 = 1032 byte non compressi possono essere codificati per un byte compresso.

Puoi ottenere una compressione maggiore comprimendo il risultato di gzip. Normalmente ciò non migliora la compressione, ma per periodi molto lunghi può farlo.

A proposito, l'approccio LZ77 utilizzato da deflate è più generale della codifica run-length. Invece di solo una lunghezza, viene utilizzata una coppia lunghezza / distanza. Ciò consente di copiare una stringa da una certa distanza indietro o di replicare un byte come in una lunghezza di esecuzione per una distanza di uno, oppure di replicare triple di byte con una distanza di tre, ecc.


6

Il rapporto di compressione di qualsiasi algoritmo di compressione sarà una funzione dei dati compressi (oltre alla lunghezza di tali dati).

Ecco un'analisi su MaximumCompression ,
Guarda uno dei campioni come,

Riepilogo dei test di riferimento per la compressione di più file

Tipo di file: più tipi di file (46 in totale)  
Numero di file da comprimere in questo test: 510  
Dimensione file totale (byte): 316.355.757 
Dimensione media file (byte): 620.305
File più grande (byte): 18.403.071
File più piccolo (byte): 3,554

4

Un enorme file contenente solo un simbolo verrà compresso molto bene.


4

10 MB di zeri nel file, comprimi con gzip da -9 a 10217. Quindi il rapporto massimo sembra essere di circa 1000x.


1

La risposta alla tua domanda dipende dall'input. Per darti un'idea di come viene eseguita la compressione, guarda questi video di sei minuti.

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

Ciò che dovresti ottenere è che la velocità di compressione dipende dalla frequenza di ciascun carattere, quindi non esiste una velocità massima generel, dipende dall'input, per il testo inglese è di circa il 65 percento.


1
Benvenuto in Super User! Si prega di citare le parti essenziali della risposta dai collegamenti di riferimento, in quanto la risposta può diventare non valida se le pagine collegate cambiano.
DavidPostill

Sarebbe più preciso dire "frequenza di ogni stringa" anziché "frequenza di ogni carattere"
JoelFan
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.