Compressez efficacement des fichiers similaires

11

J'ai souvent besoin de compresser des fichiers très similaires les uns aux autres.

Actuellement, j'utilise 7Zip, qui compresse un fichier de 16 Go à 1,2 Go en environ 35 minutes en utilisant 8 cœurs avec des paramètres Ultra.

Il me semble qu'une grande partie de ce temps est consacrée au calcul du dictionnaire à utiliser pour la compression. Étant donné que les fichiers sont très similaires, le dictionnaire réellement utilisé est probablement également similaire.

Existe-t-il un outil de compression basé sur Windows (7Zip avec une option que je ne connais pas, ou un outil différent) qui peut enregistrer le dictionnaire et réutiliser ce dictionnaire enregistré pour les fichiers suivants?

Existe-t-il une meilleure façon d'aborder le problème du maintien d'un taux de compression similaire à celui que j'ai, tout en compressant beaucoup plus rapidement?

Eric J.
la source

Réponses:

5

L' algorithme de compression Lempel-Ziv-Welch (LZW) est intrinsèquement intensif en termes de calcul, la majorité du travail lui-même étant en fait le calcul du dictionnaire. C'est exactement comme ça que fonctionne LZW.

L'algorithme lui-même ajoute une nouvelle entrée de dictionnaire pour chaque "symbole" suivant qu'il analyse, et donc à chaque itération, une nouvelle entrée est ajoutée au dictionnaire. En effet, le dictionnaire devient la copie compressée du fichier, et est donc en fait la seule chose que la compression LZW passe en tout temps à calculer.


Si vous avez utilisé quelque chose comme l' encodage Huffman , la réutilisation du dictionnaire serait en effet possible (au détriment d'un taux de compression / taille éventuellement sous-optimal). Cependant, la plupart des algorithmes et outils de compression modernes utilisent l'algorithme LZW pour l'efficacité et la vitesse (la compression Huffman nécessiterait deux passages sur les données [un pour générer l'arborescence / table Huffman, un autre pour réellement compresser les données], tandis que LZW peut être complété en un seul passage).

Percée
la source
1
Avec Huffman et un dictionnaire prédéfini, un seul passage serait-il nécessaire? Existe-t-il des outils Huffman prêts à l'emploi qui prennent en charge les dictionnaires enregistrés?
Eric J.
@EricJ. oui, avec un dictionnaire prédéfini, ce serait un codage en un seul passage. Je ne connais aucun logiciel qui puisse le faire, même si j'ai personnellement écrit des programmes qui le font. Bien que je ne l'ai pas essayé, cet outil semble pouvoir faire exactement cela. Cependant, notez simplement que (encore une fois, contrairement à LZW) pour décoder un flux binaire codé Huffman, vous avez toujours besoin du dictionnaire d'origine pour décompresser les données.
Percée du
Sur la base de l'âge de cet outil, je suppose qu'il est monothread. Je suppose que l'utilisation d'un cœur plutôt que de 8 compenserait tout avantage pour un dictionnaire fixe :-( La disponibilité du dictionnaire à l'autre extrémité est possible dans mon scénario (transfert de fichiers volumineux entre les centres de données).
Eric J.
2

Contrairement à l'algorithme DEFLATE, le LZMA de 7-Zip utilise une compression solide par défaut, qui tire parti de la redondance inter-fichiers. Cela fonctionnera avec les paramètres par défaut tant que les fichiers sont suffisamment petits.

Avec les paramètres par défaut de 2 Go pour la taille de bloc solide , un fichier de 16 Go est en fait compressé en 8 morceaux distincts.

Comme l'a déjà dit @Breakthorugh, le dictionnaire est généré à la volée. Vous pouvez le vérifier empiriquement en définissant la taille du bloc solide sur Solide (compresser tous les fichiers à la fois) et Non solide (compresser chaque fichier séparément).

L'augmentation de la taille du bloc solide entraînera en fait un ralentissement, mais cela peut entraîner un taux de compression bien meilleur. Par exemple, la compression de deux fichiers identiques se traduira par une archive presque deux fois plus volumineuse avec une compression non solide.

Dennis
la source
1
Dans mon cas, je compresse les fichiers similaires un par un, à différentes occasions. Il n'y a qu'un seul fichier de 16 Go dans une archive donnée.
Eric J.15
Ah ok. J'ai mal interprété cela. Les anciennes archives sont-elles supprimées lorsque la nouvelle est créée? Si non, serait-il admissible de stocker plusieurs fichiers dans une même archive? Cela n'aidera pas la vitesse de compression, mais selon la similitude réelle des fichiers, cela pourrait aider avec le rapport.
Dennis
1
Peu importe, ce n'est pas le cas. La mise à jour d'une archive solide prend beaucoup plus de temps, mais elle n'entraîne pas une meilleure compression.
Dennis