Pourquoi un fichier 7zipped est-il plus volumineux que le fichier raw? [dupliquer]

37

Dupliquer possible:
Pourquoi ZIP Compression ne compresse-t-il rien?

J'ai essayé 7zipping un fichier .exe, mais il est devenu plus gros.

enter image description here

Est-ce le résultat attendu?

IMB
la source
3
Oui, c'est le résultat attendu. Pourquoi? Parce que quand quelque chose est déjà compressé (= en utilisant le plus petit espace possible), il ne peut plus être compressé.
woliveirajr
4
Juste pour ajouter à tous les autres - puisque ce fichier exe est spécifiquement un installateur, la plupart de son contenu est probablement une archive zip ou cab. Vous n'obtiendrez pas les mêmes résultats d'un fichier exe normal (mais la plupart des fichiers exe normaux ne mesurent pas 145 mégaoctets)
Random832
1
Explication utilisant uniquement la logique de base: La compression trouve pour un fichier brut un fichier compressé UNIQUE et pour un fichier compressé, un fichier original UNIQUE brut (non compressé). Imaginez que vous ayez des fichiers 8 bits et que vous souhaitiez les compresser en fichiers 5 bits. Il existe 256 fichiers 8 bits uniques, mais seulement 32 fichiers 5 bits uniques (!). Par conséquent, certains fichiers 8 bits doivent être compressés dans le même fichier 5 bits (!). Et si 2 fichiers raw différents sont compressés dans le même fichier ZIP, lequel voulez-vous obtenir après la décompression? Pour toute méthode de compression, s'il existe des fichiers qui deviennent plus petits après une compression, il doit exister des fichiers qui deviennent plus gros (!)
Ivan Kuckir

Réponses:

75

Cela revient à un concept appelé entropie . Voir Wikipédia .

L’idée de base est que, s’il existait une opération de compression qui pourrait toujours rendre un fichier plus petit, la logique indique que ladite opération de compression pourra réduire tout fichier à 0 octet tout en conservant toutes les données. Mais c'est absurde , car nous savons que 0 octet ne peut transmettre aucune information. Donc, nous venons de prouver qu'il y ne peut pas exister un algorithme de compression qui rend toujours son entrée plus petite, car si tel était le cas, toute information pourrait être stockée dans 0 octet - mais 0 octet implique la absence de l'information, de sorte que vous ne pouvez pas avoir simultanément non l'information et tout information. C'est donc absurde.

En raison de ce concept théorique, chaque programme de compression que vous utilisez jamais va augmenter la taille de (ou au mieux, maintenir la même taille de) certains contribution. Autrement dit, pour tout algorithme de compression que vous concevez ou utilisez, certaines entrées seront plus petites et d’autres pas.

Les données déjà compressées sont généralement un très mauvais candidat pour une compression supplémentaire, car la plupart des algorithmes de compression sans perte reposent sur les mêmes principes théoriques. Il est possible de compresser encore plus les données mal compressées; mais cela est moins efficace que de simplement le compresser avec le meilleur algorithme disponible à partir des données d'origine.

Par exemple, si vous avez un fichier texte de 100 Mo et que vous le compressez à l'aide de l'algorithme Zip standard, il risque d'être compressé à 50 Mo. Si vous compressez ensuite le fichier Zip avec LZMA2, vous pourrez le réduire à 40 ou 45 Mo, car LZMA a une taux de compression plus élevé pour la plupart des données compressibles que Zip fait. Il va donc de soi qu'il peut également compresser les données Zip, car celui-ci n'en aspire pas toute l'entropie. Mais si vous éliminez complètement le conteneur Zip, vous pourrez peut-être le réduire encore plus en compressant le texte brut avec LZMA2, ce qui pourrait générer un résultat de l'ordre de 30 à 35 Mo (il ne s'agit que de "numéros de téléphone" pour illustrer le concept). .

Dans le cas de ce binaire que vous essayez de compresser, il est plus grand car le format de fichier 7-Zip doit créer sa propre structure interne et compresser les données de l'exécutable déjà compressé au format 7-Zip. Cela contient des choses comme un dictionnaire, un en-tête de fichier, etc. Ces données supplémentaires sont généralement plus que compensées par les économies réalisées grâce à la compression des données elles-mêmes, mais il semble que l'exécutable que vous essayez de compresser soit déjà compressé avec une forme de LZMA; sinon, cela réduirait probablement la taille de l'exécutable ou l'augmenterait légèrement, plutôt que de l'augmenter de 2 Mo (ce qui est beaucoup).

allquixotic
la source
Mais la partie la plus importante pour répondre à cette question se trouve à la fin: "Cela contient des éléments tels qu'un dictionnaire, un en-tête de fichier, etc.". Ces données supplémentaires sont généralement plus que compensées par les économies réalisées grâce à la compression des données elles-mêmes. semble que l'exécutable que vous essayez de compresser est déjà compressé avec une forme de LZMA "
jhocking
6
@ jhocking: Non, la partie la plus importante est vers le milieu: "Chaque programme de compression que vous utiliserez augmentera la taille de ... certaines entrées." Le format de fichier de 7zip a un dictionnaire / en-tête de fichier / etc, mais même si 7zip utilisait un algorithme qui ne comportait aucune de ces choses, nous avons toujours la garantie que certaines (en fait, la plupart) des entrées auront des sorties qui sont: aussi grand ou plus grand que les intrants eux-mêmes. Ceci est un fait fondamental de la théorie de l'information et n'a rien à voir avec les en-têtes de fichiers.
BlueRaja - Danny Pflughoeft
2
@Mehrdad Sure: écrivez simplement un algorithme de "compression" qui renvoie toujours l'entrée d'origine. Là; terminé. : P ... En dehors de cela, aucun algorithme de compression n’est un algorithme du tout certains métadonnées, même s’il n’ya qu’un bit au début du fichier pour indiquer si le fichier est compressé ou non (0 == non compressé, 1 == compressé). Si vous allez modifier le contenu du fichier DU TOUT , vous avez besoin certains métadonnées. Et si vous modifiez le contenu, vous allez faire certains entrées plus grandes.
allquixotic
1
Toutefois, si votre question était "Existe-t-il un algorithme de compression qui n'augmente pas la longueur de l'entrée au-delà d'un nombre fixe de métadonnées", la réponse est: je ne sais pas, mais il devrait être théoriquement possible de le faire. Facile, en fait. Tout ce que vous avez à faire est de développer un format de conteneur qui non plus contenir le fichier d'origine, ou un flux de données compressé. Ensuite, lorsque vous créez l’archive, essayez de compresser: si la taille compressée est plus grande que l’entrée, stockez simplement l’entrée originale et placez vos métadonnées au premier plan. La taille du fichier augmentera, mais si les métadonnées sont petites (suite)
allquixotic
2
@ Mehrdad: "Existe-t-il un algorithme de compression (même médiocre) qui n’augmente la longueur des entrées? "- La réponse est non. Il y a 2^(n+1)-1 messages possibles de taille n-bits ou moins. Notre algorithme doit mapper chacun de ceux-ci à un unique sortie. Si même l'un d'entre eux est mappé sur une valeur avec moins de bits, une autre valeur doit nécessairement être mappée sur une valeur avec plus.
BlueRaja - Danny Pflughoeft
7

Les algorithmes de compression sous-jacents utilisés dans 7z sont sans perte . Ce qui signifie que vous pouvez compresser / décompresser de manière itérative un fichier plusieurs fois. De plus, après chaque itération, le fichier restera exactement le même.

Malheureusement, vous ne pouvez pas vous attendre à un sans perte algorithme de compression être appliqué plusieurs fois avec toujours un résultat positif. Il y a une limite stricte sur laquelle il ne peut pas sauter. En gros, cette limite dépend de la proximité avec laquelle une séquence d'entrée définit des données aléatoires. Avant tout, des algorithmes sans perte sont utilisés pour la compression de fichiers, les transferts de données HTML Internet, les sauvegardes et autres opérations nécessitant qu'un fichier de sortie soit décompressé dans le même fichier d'entrée original.

Contrairement à sans perte compression, vous pouvez toujours vous attendre à une diminution de la taille du fichier après compression avec algorithmes de compression avec perte (ou avec perte) . L'inconvénient est que vous ne pouvez pas exactement restaurer un fichier d'origine après une seule itération compresser-décompresser. Ces algorithmes sont particulièrement connus pour les transmissions et stockage audio / vidéo / image.

bzip2 , LZMA , LZMA2 et d'autres algorithmes utilisés par 7z format sont tous sans perte . Par conséquent, il y aura une limite après laquelle il ne pourra plus se compresser. De plus, les images exécutables (.exe) sont généralement des fichiers fortement compressés. 7zip Comme beaucoup d’autres outils de compression, certaines métadonnées sont incorporées, ce qui peut en fait rendre le fichier de sortie plus volumineux.

Casse-tête: et si nous avions un algorithme sans perte qui peut toujours réduire la taille d'un fichier?

Dans ce cas, vous verrez toujours que le fichier compressé est plus petit que le fichier d'entrée. Voir un commentaire ci-dessous pourquoi ce n'est pas possible.

oleksii
la source
5
Preuve par contradiction. Hypothèse: Supposons qu'il soit toujours possible de compresser un fichier avec un algorithme sans perte. Étape 1. La compression simple réduit un fichier de sortie d'au moins un bit. Si c'est le cas, après plusieurs itérations, nous aboutirons à un fichier ne contenant que deux bits. Étape 2 L'itération suivante crée un fichier d'une taille de 1 bit. Étape 3 Mais les algorithmes de compression sont sans perte, ce qui signifie qu’une seule décompression valide est autorisée. Clairement, vous ne pouvez pas restaurer 2 bits originaux à partir de 1 bit compressé - vous devrez deviner. Le dernier point viole l'hypothèse.
oleksii
Vous ne pouvez pas garantir un algorithme qui rend le fichier plus petit mais vous pouvez garantir un algorithme qui n'augmentera pas la taille en n'appliquant aucune "compression" dans ces cas. Pour ne pas vraiment augmenter la taille du fichier, vous devez l'indiquer hors bande (par exemple, dans le nom du fichier).
jeteon
@jeteon Je ne suis pas sûr de ce que vous essayez de dire.
oleksii
J'ajoutais simplement que, puisque vous avez toujours la possibilité de ne pas compresser l'entrée, vous pouvez avoir un programme de compression qui ne compressera pas le fichier du tout au pire. Fondamentalement, si vous déterminez que la version compressée est plus volumineuse que la version non compressée, vous la laissez simplement. Vous devrez alors également indiquer que c'est le cas sans ajouter de taille à la taille de la sortie afin que le décompresseur sache que le fichier n'a pas été compressé. La seule façon de procéder sans augmenter la taille du fichier consiste à modifier le nom du fichier.
jeteon
@ Jeton oh, je vois. Oui, ça a du sens.
oleksii
6

Si l'exécutable d'origine était déjà compressé (ou contenait des données fortement compressées ou des données non compressibles), sa compression augmentera la taille.

PhonicUK
la source
2

La plupart des algorithmes de compression utilisent ce que l’on appelle une table de symboles, c’est-à-dire des parties du fichier qu’il utilise comme éléments. POUVEZ compresse. Ceci, bien sûr, crée une surcharge dans le fichier mais aboutit généralement à un fichier beaucoup plus petit.

Dans les fichiers déjà compressés, cela crée toujours un ensemble de symboles, mais il y a très peu de choses qui peuvent réduire la taille. Dans votre cas, la table des symboles du fichier déjà compressé se situe probablement autour de 2 Mo ou plus si le fichier a été compressé.

Chad Harrison
la source
0

l'ideea de compression:

le logiciel de compression crée une liste de fichiers et élimine le contenu en double.

lors de la compression de fichiers déjà compressés, vous pouvez obtenir des fichiers compressés plus volumineux que l'original.

fromnaboo
la source