Que fait réellement la combinaison de méthodes de compression dans 7z?

11

L'outil de ligne de commande 7z vous permet de spécifier plusieurs méthodes de compression , par exemple:

# 7-zip archive type, strongest (9) compression, methods PPMd, BCJ2, LZMA2
$ 7z a -t7z -mx=9 -m0=PPMd -m1=BCJ2 -m2=LZMA2 myarchive.7z somefile.xml

Toutes les méthodes sont utilisées d'une manière ou d'une autre spécifiées dans les métadonnées:

$ 7z l -slt myarchive.7z

7-Zip [64] 9.22 beta  Copyright (c) 1999-2011 Igor Pavlov  2011-04-18

Listing archive: myarchive.
7z

--
Path = myarchive.7z
Type = 7z
Method = LZMA2 PPMD BCJ2
[..]

----------
Path = somefile.xml
[..]
Method = PPMD:o32:mem192m BCJ2 LZMA2:48m
Block = 0

Il ne pas semble exécuter le fichier à travers les trois méthodes, choisir le meilleur. Au contraire, il choisit apparemment toujours le premier, car le changement de l'ordre de la méthode affecte considérablement la taille du fichier.

Même si j'ajoute plusieurs fichiers, tels qu'un fichier XML (PPMd donne la meilleure compression) et un fichier binaire (LZMA2 le fait), il répertorie toujours toutes les méthodes pour les deux fichiers et ne semble pas changer dynamiquement par fichier.

En fait, la documentation indique spécifiquement que «vous pouvez utiliser n'importe quel nombre de méthodes», mais elle ne dit pas pourquoi .

Ce que j'essaie de réaliser, c'est une archive par fichier "essayez plusieurs méthodes, choisissez celle qui convient le mieux". Je peux bien sûr y parvenir manuellement avec un peu de script, mais vraisemblablement, les méthodes de compression de chaînage devraient faire exactement cela?

Sören Kuklau
la source
La modification de l'ordre des méthodes de compression doit modifier la taille compressée même si toutes les méthodes sont appliquées en séquence. La plupart des compressions proviennent généralement de la première méthode appliquée. Le résultat de cela a généralement une entropie élevée, il est donc difficile de compresser davantage. Il existe des exceptions pour les transformations qui ne sont pas censées compresser les données elles-mêmes, mais qui les codent pour être plus compressibles - par exemple, la séquence 1, 2, 3, 4, 5 n'a pas de répétition de valeurs, mais a des répétitions de différences, donc une transformation delta améliore la compressibilité. C'est la réponse de Daniel B.
Steve314
Cependant, je ne sais pas vraiment ce que fait 7zip - commenter simplement votre logique "car changer l'ordre de la méthode affecte la taille du fichier de manière significative".
Steve314

Réponses:

5

Généralement, les données compressées ne peuvent pas être compressées (davantage) efficacement. Une fois la première méthode de compression appliquée, la taille du fichier ne peut pas être réduite de manière significative.

Il -mN=Xs'agit principalement de spécifier des filtres (extraits du fichier d'aide de Windows):

Filtres pris en charge:

Delta Filtre Delta ("Il est possible de définir le décalage delta en octets. Par exemple, pour compresser des fichiers WAV stéréo 16 bits, vous pouvez définir" 0 = Delta: 4 ". Le décalage delta par défaut est 1.")

Convertisseur BCJ pour exécutables x86

Convertisseur BCJ2 pour les exécutables x86 (version 2) ("BCJ2 est un convertisseur de branche pour les exécutables x86 32 bits (version 2). Il convertit certaines instructions de branche pour augmenter la compression.")

Convertisseur ARM pour les exécutables ARM (Little Endian)

Convertisseur ARMT pour les exécutables ARM Thumb (Little Endian)

Convertisseur IA64 pour exécutables IA-64

Convertisseur PPC pour les exécutables PowerPC (big endian)

Convertisseur SPARC pour les exécutables SPARC

Également à partir du fichier d'aide, un exemple avancé exploitant plusieurs flux de sortie du filtre BCJ2:

7z a -t7z archive.7z *.exe *.dll -m0=BCJ2 -m1=LZMA:d23 -m2=LZMA:d19 -m3=LZMA:d19      -mb0:1 -mb0s1:2 -mb0s2:3

ajoute des fichiers * .exe et * .dll à l'archive archive.7z à l'aide du convertisseur BCJ2, LZMA avec 8 Mo de dictionnaire pour le flux de sortie principal (s0) et LZMA avec 512 Ko de dictionnaire pour les flux de sortie s1 et s2 de BCJ2.

Daniel B
la source
"Une fois la première méthode de compression appliquée, la taille du fichier ne peut pas être réduite de manière significative." - Sûr. J'espérais que la spécification de plusieurs méthodes permettrait d'essayer, par fichier , chaque méthode spécifiée et de choisir la plus efficace. Naturellement, cela ralentirait considérablement la compression.
Sören Kuklau
2

Il semble que vous puissiez appliquer des filtres dans une séquence.

Ce message de l'année dernière a une belle explication:

Que signifie le nombre après le commutateur -m de 7-zip?

Ce nombre vous permet de définir l'ordre des opérations de compression si vous en utilisez plusieurs à la fois.

Voici un exemple tiré de la documentation:

7z a a.7z *.exe *.dll -m0=BCJ2 -m1=LZMA:d25 -m2=LZMA:d19 -m3=LZMA:d19 -mb0:1 -mb0s1:2 -mb0s2:3

ajoute des fichiers * .exe et * .dll pour archiver a.7z en utilisant le filtre BCJ2, LZMA avec un dictionnaire de 32 Mo pour le flux de sortie principal (s0) et LZMA avec un dictionnaire de 512 Ko pour les flux de sortie s1 et s2 de BCJ2.

La première compression est le nombre le plus bas, qui est zéro. Dans cet exemple, zéro est défini sur BCJ2. Vient ensuite un, qui est LZMA. Deux et trois sont également LZMA, mais ils utilisent différents paramètres d.

L'option -mb est utilisée pour "lier" la sortie d'une compression à l'entrée d'une autre. Dans cet exemple, BCJ2 a une entrée et quatre sorties. La sortie zéro va à la compression numéro un. La sortie un va à la compression numéro deux. La sortie deux va à la compression numéro trois. La sortie trois n'est pas liée (car elle n'a pas besoin d'être compressée à nouveau).

Marcelo
la source