Quel est le taux de compression maximal de gzip?

51

Quelle est la plus grande taille à laquelle un gzip (disons 10 Ko pour un exemple) peut être décompressé?

Des morts-vivants
la source

Réponses:

91

Cela dépend beaucoup des données compressées. Un test rapide avec un fichier de 1 Go rempli de zéros donne une taille compressée d’environ 120 Ko, de sorte que votre fichier de 10 Ko pourrait potentiellement être étendu à environ 85 Mo.

Si, par exemple, les données ont une faible redondance, par exemple, l’archive contient des fichiers d’images dans un format compressé nativement (gif, jpg, png, ...), gzip peut ne pas ajouter de compression supplémentaire. Pour les fichiers binaires tels que les exécutables de programme, vous pouvez voir une compression allant jusqu'à 2: 1, pour le texte brut, HTML ou autres balises, 3: 1 ou 4: 1 ou plus n'est pas improbable. Vous pouvez voir 10: 1 dans certains cas, mais le ~ 8700: 1 vu avec un fichier contenant un seul symbole est quelque chose que vous n'allez pas voir en dehors de circonstances aussi artificielles.

Vous pouvez vérifier la quantité de données résultant de la décompression d'un fichier gzip, sans écrire réellement son contenu non compressé sur le disque, avec gunzip -c file.gz | wc --bytes- ceci décompresse le fichier mais ne stocke pas les résultats, mais les passe à la place, wcqui compte le nombre d'octets à leur passage. puis les jeter. Si le contenu compressé est un fichier tar contenant un grand nombre de petits fichiers, vous constaterez qu'il faut nettement plus d'espace disque pour décompresser l'archive complète, mais dans la plupart des cas, le nombre renvoyé par la gunzipsortie de la tuyauterie wcest aussi précis que nécessaire.

David Spillett
la source
J'ai vu le code HTML se développer à 10x (bien sûr, x3 et x4 étaient les plus courants!) ... peut-être beaucoup de données redondantes pour celles qui explosaient + 8x. Je pense que la page en question qui faisait cela était une page d'informations php.
Zombies
Le balisage répétitif, comme on le voit dans le résultat de phpinfo(), compresse très bien. Les informations techniques contenues dans cette sortie contiennent également plus de répétitions directes que le bloc moyen du langage naturel, et la distribution de l'alphabet est probablement moins lisse, ce qui pourrait aider l'étape Huffman à obtenir de meilleurs résultats.
David Spillett
Cette réponse ne tient pas compte des données compressées intentionnellement malveillantes . On peut créer un fichier zip malveillant d’environ 10 Ko pouvant atteindre un peu plus de 4 Go.
David Schwartz
Les bombes Zip de cette ampleur reposent sur des archives imbriquées; vous remarquerez donc qu’un humain qui décompresse le fichier remarque quelque chose d’étrange avant longtemps. Ils peuvent cependant être utilisés comme une attaque par déni de service efficace contre les scanners automatisés (sur les services de messagerie, etc.).
David Spillett le
1
@DavidSpillett: les bombes zip imbriquées se développent dans des tailles de l'ordre du pétaoctet. Ce n'est pas ce que je parle. Regardez même une seule couche d'une bombe zip typique.
David Schwartz
10

En règle générale, la compression ne dépasse pas 95% (de sorte que les données compressées compressées à 10 Ko compressées à environ 200 Ko), mais il existe des fichiers spécialement conçus qui se développent de manière exponentielle. Recherchez 42.zip, il décompresse en quelques pétaoctets de données (sans signification).

liori
la source
4
Wikipedia dit que 42.zip est "contenant cinq couches de fichiers zip imbriqués en ensembles de 16", ce qui en fait un exemple non valide pour la décompression (uniquement pour la décompression récursive).
Tgr
5
En effet, 42.zip est particulièrement dangereux pour les outils qui analysent automatiquement les fichiers zip de manière récursive, par exemple les antivirus.
thomasrutter
4
C'est zip, pas gzip
BeniBela
8

Cité textuellement de https://stackoverflow.com/a/16794960/293815

Le taux de compression maximal du format Deflate est 1032: 1. En effet, la plus longue exécution pouvant être codée est de 258 octets. Au moins deux bits sont nécessaires pour chaque exécution de ce type (un bit pour le code de longueur et un bit pour le code de distance). Par conséquent, 4 * 258 = 1032 octets non compressés peuvent être codés par octet compressé.

Vous pouvez obtenir plus de compression en compressant le résultat de gzip. Normalement, cela n'améliore pas la compression, mais pour de très longues durées, c'est possible.

En passant, l'approche LZ77 utilisée par deflate est plus générale que le codage par longueur. Au lieu d'une longueur, une paire longueur / distance est utilisée. Cela permet de copier une chaîne depuis une certaine distance ou de répliquer un octet comme dans la longueur d'une ligne, ou de répliquer des triples d'octets avec une distance de trois, etc.

ioquatix
la source
6

Le taux de compression de tout algorithme de compression sera fonction des données compressées (en plus de la longueur de ces données).

Voici une analyse à MaximumCompression ,
Regardez un des échantillons comme,

Résumé des tests d'évaluation de la compression de plusieurs fichiers

Type de fichier: Plusieurs types de fichiers (46 au total)  
Nombre de fichiers à compresser dans ce test: 510  
Taille totale du fichier (octets): 316.355.757 
Taille moyenne du fichier (octets): 620 305
Le plus grand fichier (octets): 18 403 071
Le plus petit fichier (octets): 3 554
nik
la source
4

Un fichier énorme contenant un seul symbole se compresse très bien.

geek
la source
4

10 Mo de zéros dans le fichier, compresser avec gzip -9 à 10217. Le rapport maximal semble donc être autour de 1000x.

nikos
la source
1

La réponse à votre question dépend de l'entrée. Pour vous donner une idée de la compression, regardez ces vidéos de six minutes.

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

Ce que vous devriez en déduire, c'est que le taux de compression dépend de la fréquence de chaque caractère. Il n'y a donc pas de fréquence maximale, cela dépend de l'entrée. Pour le texte anglais, il est d'environ 65%.

brunsgaard
la source
1
Bienvenue sur Super User! Veuillez citer les parties essentielles de la réponse à partir du (des) lien (s) de référence, car la réponse peut devenir invalide si la ou les pages liées changent.
DavidPostill
Il serait plus précis de dire "fréquence de chaque chaîne" plutôt que "fréquence de chaque caractère"
JoelFan le