Qual è il rapporto di compressione massimo di gzip?
Qual è la più grande dimensione a cui un gzip (diciamo 10kb per un esempio) può essere decompresso?
Qual è la più grande dimensione a cui un gzip (diciamo 10kb per un esempio) può essere decompresso?
Aggiornamento 2020-02-06: Come menzionato nei commenti, non sono stato in grado di riprodurre il risultato originale con gzip. Lavorando sul presupposto che ho accidentalmente usato un formato di compressione diverso in quel test veloce originale ho ripetuto con gzip e aggiornato le cifre qui sotto di conseguenza. Questo nuovo risultato concorda con la compressione massima teorica indicata in altre risposte/commenti.
Dipende molto dai dati da comprimere. Un rapido test con un file da 1Gb pieno di zeri usando una versione standard di gzip (con opzioni predefinite o specificando -9) dà una dimensione compressa di ~1018Kb, quindi il tuo file da 10Kb potrebbe potenzialmente espandersi in ~10Mbyte.
Se i dati hanno una bassa ridondanza di partenza, per esempio, l'archivio contiene file di immagini in un formato che è compresso nativamente (gif, jpg, png, …), allora gzip potrebbe non aggiungere ulteriore compressione. Per i file binari come i programmi eseguibili potresti vedere una compressione fino a 2:1, per il testo semplice, HTML o altri markup non è improbabile una compressione di 3:1 o 4:1 o più. Potreste vedere 10:1 in alcuni casi, ma il ~1030:1 visto con un file pieno di un singolo simbolo è qualcosa che non vedrete al di fuori di circostanze similmente artificiali.
Potete controllare quanti dati risulterebbero dal decomprimere un file gzip, senza effettivamente scrivere il suo contenuto non compresso sul disco, con gunzip -c file.gz | wc --bytes
- questo decomprimerà il file ma non memorizzerà i risultati, passandoli invece a wc
che conterà il numero di byte al loro passaggio e poi li scarterà. Se il contenuto compresso è un file tar che contiene molti molti piccoli file, potreste scoprire che è richiesto molto più spazio su disco per decomprimere l'intero archivio, ma nella maggior parte delle circostanze, il conteggio restituito dal piping gunzip
in uscita attraverso wc
sarà accurato quanto vi serve.
Citato testualmente da https://stackoverflow.com/a/16794960/293815
Il massimo rapporto di compressione del formato deflate è 1032:1. Questo perché la corsa più lunga che può essere codificata è di 258 byte. Almeno due bit sono richiesti per ogni corsa di questo tipo (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.
Si può ottenere una maggiore compressione gzippando il risultato di gzip. Normalmente questo non migliora la compressione, ma per le tirature molto lunghe può farlo.
A proposito, l'approccio LZ77 usato da deflate è più generale della codifica run-length. Invece di una semplice lunghezza, viene usata una coppia lunghezza/distanza. Questo permette di copiare una stringa da una certa distanza indietro, o replicare un byte come in run-length per una distanza di uno, o replicare triple di byte con una distanza di tre, ecc.
Il rapporto di compressione di qualsiasi algoritmo di compressione sarà una funzione dei dati da comprimere (oltre alla lunghezza di quei dati).
Qui c'è un'analisi a MaximumCompression , Guarda uno dei campioni come, Sintesi dei test di benchmark sulla compressione di più file
File type : Multiple file types (46 in total) # of files to compress in this test : 510 Total File Size (bytes) : 316.355.757 Average File Size (bytes) : 620,305 Largest File (bytes) : 18,403,071 Smallest File (bytes) : 3,554
La risposta alla tua domanda, dipende dall'input. Per darti un'idea di come viene fatta la compressione guarda questo video di sei minuti. https://www.youtube.com/watch?v=ZdooBTdW5bM
Quello che dovresti capire è che il tasso di compressione dipende dalla frequenza di ogni carattere, quindi non c'è un tasso massimo generalizzato, dipende dall'input, per il testo inglese è circa il 65%.