web-dev-qa-db-fra.com

Combien de fois un fichier peut-il être compressé?

Je pensais à la compression, et il semble qu'il devrait y avoir une sorte de limite à la compression qui pourrait lui être appliquée, sinon ce serait un seul octet.

Donc ma question est, combien de fois puis-je compresser un fichier avant:

  • Il ne diminue pas?
  • Le fichier est corrompu?

Ces deux points sont-ils identiques ou différents?

Où apparaît le point de rendements décroissants?

Comment trouver ces points?

Je ne parle pas d'un algorithme spécifique ou d'un fichier particulier, juste en général.

51
samoz

Pour la compression sans perte, la seule façon de savoir combien de fois vous pouvez gagner en recompressant un fichier est en essayant. Cela dépendra de l'algorithme de compression et du fichier que vous compressez.

Deux fichiers ne peuvent jamais être compressés sur la même sortie, vous ne pouvez donc pas descendre à un octet. Comment un octet pourrait-il représenter tous les fichiers dans lesquels vous pourriez décompresser?

La raison pour laquelle la deuxième compression fonctionne parfois est qu'un algorithme de compression ne peut pas effectuer une compression parfaite omnisciente. Il y a un compromis entre le travail qu'il doit faire et le temps qu'il faut pour le faire. Votre fichier passe de toutes les données à une combinaison de données sur vos données et les données elles-mêmes.

Exemple

Prenons l'exemple de l'encodage de la longueur d'exécution (probablement la compression utile la plus simple).

04 04 04 04 43 43 43 43 51 52 11 octets

Cette série d'octets pourrait être compressée comme suit:

[4] 04 [4] 43 [-2] 51 52 7 octets (je mets les métadonnées entre parenthèses)

Où le nombre positif entre parenthèses est un nombre de répétitions et le nombre négatif entre parenthèses est une commande pour émettre les caractères -n suivants lorsqu'ils sont trouvés.

Dans ce cas, nous pourrions essayer une compression de plus:

[3] 04 [-4] 43 fe 51 52 7 octets (fe est votre -2 vu comme des données de complément à deux)

Nous n'avons rien gagné et nous allons commencer à grandir à la prochaine itération:

[-7] 03 04 fc 43 fe 51 52 8 octets

Nous allons croître d'un octet par itération pendant un certain temps, mais cela va même empirer. Un octet ne peut contenir que des nombres négatifs jusqu'à -128. Nous allons commencer à croître de deux octets lorsque le fichier dépasse 128 octets de longueur. La croissance va encore empirer à mesure que le fichier grossit.

Un vent de face souffle contre le programme de compression - les métadonnées. Et aussi, pour les compresseurs réel, l'en-tête est collé au début du fichier. Cela signifie qu'à terme, le fichier commencera à croître à chaque compression supplémentaire.


RLE est un point de départ. Si vous voulez en savoir plus, regardez LZ77 (qui regarde dans le fichier pour trouver des modèles) et LZ78 (qui construit un dictionnaire). Les compresseurs comme Zip essaient souvent plusieurs algorithmes et utilisent le meilleur.

Voici quelques cas où je peux penser où la compression multiple a fonctionné.

  1. J'ai travaillé dans un magazine Amiga livré avec un disque. Naturellement, nous avons emballé le disque dans les branchies. L'un des outils que nous avons utilisés vous permet de compresser un exécutable de sorte que lors de son exécution, il se décompresse et s'exécute lui-même. Parce que l'algorithme de décompression devait être dans chaque exécutable, il devait être petit et simple. Nous avons souvent obtenu des gains supplémentaires en compressant deux fois. La décompression a été effectuée en RAM. Étant donné que la lecture d'une disquette était lente, nous avons également souvent augmenté la vitesse!
  2. Microsoft a pris en charge la compression RLE sur les fichiers bmp. De plus, de nombreux traitements de texte ont fait l'encodage RLE. Les fichiers RLE sont presque toujours compressibles de manière significative par un meilleur compresseur.
  3. Beaucoup de jeux sur lesquels j'ai travaillé utilisaient un petit décompresseur LZ77 rapide. Si vous compressez un grand rectangle de pixels (surtout s'il a beaucoup de couleur d'arrière-plan ou s'il s'agit d'une animation), vous pouvez très souvent compresser deux fois avec de bons résultats. (La raison? Vous n'avez que tant de bits pour spécifier la distance de rétrospective et la longueur, donc un seul grand motif répété est codé en plusieurs morceaux, et ces morceaux sont hautement compressibles.)
64
Nosredna

Généralement, la limite est d'une compression. Certains algorithmes entraînent un taux de compression plus élevé et l'utilisation d'un algorithme médiocre suivi d'un bon algorithme entraînera souvent des améliorations. Mais utiliser le bon algorithme en premier lieu est la bonne chose à faire.

Il y a une limite théorique à la quantité d'un ensemble donné de données qui peut être compressé. Pour en savoir plus, vous devrez étudier théorie de l'information .

17
Martin Liversage

En général, pour la plupart des algorithmes, la compression de plusieurs fois n'est pas utile. Il y a cependant un cas particulier.

Si vous avez un grand nombre de fichiers en double, le format Zip compressera chacun indépendamment, et vous pourrez ensuite compresser le premier fichier Zip pour supprimer les informations Zip en double. Plus précisément, pour 7 fichiers Excel identiques de 108 Ko, les compresser avec 7-Zip entraîne une archive de 120 Ko. Zipper à nouveau entraîne une archive de 18 Ko. En passant, vous obtenez des rendements décroissants.

14
CoderTao

Supposons que nous ayons un fichier de N bits de long et que nous voulons le compresser sans perte, afin de pouvoir récupérer le fichier d'origine. Il y a 2 ^ N fichiers possibles sur N bits, et donc notre algorithme de compression doit changer l'un de ces fichiers en l'un des 2 ^ N autres possibles. Cependant, nous ne pouvons pas exprimer 2 ^ N fichiers différents en moins de N bits.

Par conséquent, si nous pouvons prendre certains fichiers et les compresser, nous devons avoir des fichiers de cette longueur sous compression, pour équilibrer ceux qui raccourcissent.

Cela signifie qu'un algorithme de compression ne peut compresser que certains fichiers, et il doit en fait en allonger certains. Cela signifie que, en moyenne, la compression d'un fichier aléatoire ne peut pas le raccourcir, mais peut l'allonger.

Les algorithmes de compression pratiques fonctionnent car nous n'utilisons généralement pas de fichiers aléatoires. La plupart des fichiers que nous utilisons ont une sorte de structure ou d'autres propriétés, qu'il s'agisse de texte ou d'exécutables de programme ou d'images significatives. En utilisant un bon algorithme de compression, nous pouvons considérablement raccourcir les fichiers des types que nous utilisons normalement.

Cependant, le fichier compressé n'est pas l'un de ces types. Si l'algorithme de compression est bon, la plupart de la structure et de la redondance ont été éliminées, et ce qui reste ressemble à peu près au hasard.

Aucun algorithme de compression, comme nous l'avons vu, ne peut compresser efficacement un fichier aléatoire, et cela s'applique également à un fichier d'aspect aléatoire. Par conséquent, essayer de recompresser un fichier compressé ne le raccourcira pas considérablement et pourrait bien l'allonger.

Ainsi, le nombre normal de fois qu'un algorithme de compression peut être exécuté de manière rentable est de un.

La corruption ne se produit que lorsque nous parlons de compression avec perte. Par exemple, vous ne pouvez pas nécessairement récupérer une image précisément à partir d'un fichier JPEG. Cela signifie qu'un compresseur JPEG peut raccourcir de manière fiable un fichier image, mais seulement au prix de ne pas pouvoir le récupérer exactement. Nous sommes souvent disposés à le faire pour les images, mais pas pour le texte, et en particulier les fichiers non exécutables.

Dans ce cas, il n'y a aucune étape à laquelle la corruption commence. Il commence lorsque vous commencez à le comprimer et s'aggrave à mesure que vous le compressez. C'est pourquoi de bons programmes de traitement d'image vous permettent de spécifier le niveau de compression souhaité lorsque vous créez un JPEG: vous pouvez donc équilibrer la qualité de l'image par rapport à la taille du fichier. Vous trouvez le point d'arrêt en considérant le coût de la taille du fichier (qui est plus important pour les connexions réseau que le stockage en général) par rapport au coût de la qualité réduite. Il n'y a pas de bonne réponse évidente.

7
David Thornley

Habituellement, une compression est suffisante si l'algorithme est bon.
En fait, la compression de plusieurs fois pourrait entraîner une augmentation de la taille

Vos deux points sont différents.

  • Compression répétée et réalisable pas d'amélioration de la réduction de taille
    est une condition théorique attendue
  • Compression répétée provoquant la corruption
    est probablement une erreur dans l'implémentation (ou peut-être l'algorithme lui-même)

Voyons maintenant quelques exceptions ou variations,

  • Cryptage peut être appliqué à plusieurs reprises sans réduction de taille
    (en fait parfois augmenter de taille) dans un but de sécurité accrue
  • fichiers image, vidéo ou audio de plus en plus compressés
    perdra des données (effectivement être "corrompu" dans un sens)
5
nik

Vous pouvez compresser des temps infinis. Cependant, la deuxième compression et les autres compressions ne produisent généralement qu'un fichier plus volumineux que le précédent. Il est donc inutile de compresser plus d'une fois.

3
Lomir

Vous pouvez compresser un fichier autant de fois que vous le souhaitez. Mais pour la plupart des algorithmes de compression, la compression résultante à partir de la deuxième fois sera négligeable.

3
Matthew Vines

Combien de fois puis-je compresser un fichier avant qu'il ne devienne plus petit?

En général, pas même un. Quel que soit l'algorithme de compression que vous utilisez, il doit toujours exister un fichier qui ne soit pas compressé du tout, sinon vous pourriez toujours compresser à plusieurs reprises jusqu'à ce que vous atteigniez 1 octet, par votre même argument.

Combien de fois puis-je compresser un fichier avant qu'il ne soit corrompu?

Si le programme que vous utilisez pour compresser le fichier fait son travail, le fichier ne sera jamais corrompu (bien sûr, je pense à compression sans perte ).

3
Federico A. Ramponi

La compression (je pense sans perte) signifie essentiellement exprimer quelque chose de manière plus concise. Par exemple

111111111111111

pourrait être exprimé de manière plus cohérente

15 X '1'

C'est ce qu'on appelle le codage de longueur d'exécution. Une autre méthode qu'un ordinateur peut utiliser consiste à trouver un modèle qui est régulièrement répété dans un fichier.

Il y a clairement une limite à la quantité de ces techniques qui peuvent être utilisées, par exemple le codage de longueur ne va pas avoir d'effet sur

15 X '1'

car il n'y a pas de motifs répétitifs. De même, si les méthodes de remplacement de motif convertissent des motifs longs en 3 caractères, leur nouvelle application aura peu d'effet, car les seuls motifs répétitifs restants seront de 3 longueurs ou plus courtes. En général, l'application de la compression à un fichier déjà compressé le rend légèrement plus grand, en raison de divers frais généraux. Appliquer une bonne compression à un fichier mal compressé est généralement moins efficace que d'appliquer uniquement la bonne compression.

3
Peter

Voici l'algorithme de compression ultime (en Python) qui, par une utilisation répétée, compressera toute chaîne de chiffres jusqu'à la taille 0 (il est laissé au lecteur un exercice sur la façon de l'appliquer à une chaîne d'octets).


def compress(digitString):
    if digitString=="":
        raise "already as small as possible"
    currentLen=len(digitString)
    if digitString=="0"*currentLen:
        return "9"*(currentLen-1)
    n=str(long(digitString)-1); #convert to number and decrement
    newLen=len(n);
    return ("0"*(currentLen-newLen))+n; # add zeros to keep same length

#test it
x="12";
while not x=="":
    print x;
    x=compress(x)

Le programme délivre 12 11 10 09 08 07 06 05 04 03 02 01 00 9 8 7 6 5 4 3 2 1 0 puis chaîne vide. Il ne comprime pas la chaîne à chaque passage, mais avec suffisamment de passages, il compresse n'importe quelle chaîne de chiffres jusqu'à une chaîne de longueur nulle. Assurez-vous de noter combien de fois vous l'envoyez via le compresseur, sinon vous ne pourrez pas le récupérer.

2
paperhorse

C'est une très bonne question. Vous pouvez afficher le fichier sous différents points de vue. Peut-être savez-vous a priori que ce fichier contient des séries arithmétiques. Permet de le visualiser en tant que flux de données de "octets", "symboles" ou "échantillons".

Certaines réponses peuvent vous donner "théorie de l'information" et "statistiques mathématiques". Veuillez vérifier la monographie de ces chercheurs pour une compréhension approfondie:

A. Kolmogorov

S. Kullback

С. Shannon

N. Wiener

L'un des principaux concepts de la théorie de l'information est entropie . Si vous avez un flux d '"octets" .... L'entropie de ces octets ne dépend pas des valeurs de vos "octets", ou "échantillons" ... Si n'était définie que par des fréquences avec lesquelles les octets récupèrent des valeurs différentes. L'entropie maximale a sa place pour un flux de données aléatoire complet. L'entropie minimale, qui est égale à zéro, a sa place pour le cas où vos "octets" ont une valeur identique.

Il ne diminue pas?

L'entropie est donc le nombre minimum de bits par "octet", que vous devez utiliser lors de l'écriture d'informations sur le disque. Bien sûr, c'est le cas si vous utilisez l'algorithme de Dieu. Les algorithmes heuristiques sans perte de compression réels ne le sont pas.

Le fichier est corrompu?

Je ne comprends pas le sens de la question. Vous ne pouvez pas écrire de bits sur le disque et vous allez écrire un fichier corrompu sur le disque avec une taille égale à 0 bits. Bien sûr, il est corrompu, mais sa taille est de zéro bit.

2
bruziuz

Exemple d'une technique de compression plus avancée utilisant "une double table ou une matrice croisée" Élimine également les symboles de désunion énormes dans l'algorithme

[EXEMPLE PRÉCÉDENT] Prenons comme exemple l'encodage de la longueur d'exécution (probablement la compression utile la plus simple).

04 04 04 04 43 43 43 43 51 52 11 octets

Cette série d'octets pourrait être compressée comme suit:

[4] 04 [4] 43 [-2] 51 52 7 octets (je mets les métadonnées entre parenthèses)

[DEVIENT] 04.43.51.52 VALEURS 4.4. ** - 2 COMPRESSION

Compression supplémentaire en utilisant des symboles supplémentaires comme valeurs de substitution

VALEURS 04.A.B.C 4.4. ** - 2 COMPRESSION

0
C.L.U.

En théorie, nous ne le saurons jamais, c'est une chose sans fin:

En informatique et en mathématiques, le terme théorème du plein emploi a été utilisé pour désigner un théorème montrant qu'aucun algorithme ne peut effectuer de manière optimale une tâche particulière effectuée par une classe de professionnels. Le nom vient du fait qu'un tel théorème garantit qu'il y a une portée infinie pour continuer à découvrir de nouvelles techniques pour améliorer la façon dont au moins une tâche spécifique est effectuée. Par exemple, le théorème du plein emploi pour les rédacteurs de compilateurs indique qu'il n'existe pas de compilateur optimisant la taille prouvablement parfait, car une telle preuve pour le compilateur devrait détecter les calculs sans terminaison et les réduire à une instruction infinie boucle. Ainsi, l'existence d'un compilateur d'optimisation de taille prouvablement parfait impliquerait une solution au problème d'arrêt, qui ne peut pas exister , faisant de la preuve elle-même un problème indécidable .

(source)

0
ajax333221