Compression de nombreux gros fichiers similaires

18

J'ai des centaines de gros fichiers similaires (30 mégaoctets chacun) que je veux compresser. Chaque paire de fichiers contient 99% des mêmes données (moins de 1% de différence), donc je m'attends à ne pas avoir plus de 40 à 50 mégaoctets d'archives.

Un seul fichier peut être compressé de 30 Mo à 13-15 Mo (avec xz -1, gz -1, bzip2 -1), mais lors de la compression deux ou plusieurs fichiers que je veux avoir des archives avec la taille 13-15MB + N*0.3MBoù N est le nombre de fichiers.

Lorsque j'utilise tar(pour créer une archive solide) et xz -6(pour définir un dictionnaire de compression comme étant plus grand qu'un fichier - Mise à jour - cela ne suffisait pas! ), J'ai toujours une archive de taille N*13MB.

Je pense que les deux gzipet bzip2ne m'aideront pas car ils ont un dictionnaire de moins de 1 Mo, et mon flux tar a des répétitions tous les 30 Mo.

Comment puis-je archiver mon problème sous Linux moderne en utilisant des outils standard?

Est-il possible de régler xzpour compresser rapidement, mais utiliser un dictionnaire de plus de 30 à 60 Mo?

Mise à jour : a fait l'affaire avec tar c input_directory | xz --lzma2=dict=128M,mode=fast,mf=hc4 --memory=2G > compressed.tar.xz. Pas sûr de la nécessité mf=hc4et des --memory=2Goptions; mais dict=128Mdéfinissez le dictionnaire pour qu'il soit suffisamment grand (plus grand qu'un fichier) et mode=fastaccélérez le processus plus rapidement que -e.

osgx
la source
L'exécution xz -1 --memory=2Gn'a pas aidé, testé sur 2 et 4 fichiers de l'ensemble.
osgx

Réponses:

12

Compte tenu de vos coordonnées, je suppose que vous avez vérifié que vos fichiers ont vraiment 99% de données en commun, avec un écart de 1% contigu (ou presque contigu).

Tout d'abord, vous devez utiliser tar pour créer une archive avec vos fichiers à l'intérieur. Pour les tests, je créerais un .tar avec 10 fichiers, donc ayant une taille de 300 Mo.

Ensuite, en utilisant xz, vous devez le définir de sorte que le dictionnaire soit plus grand que la taille d'un fichier. Puisque vous ne dites pas si vous avez des restrictions de mémoire, j'irais avec xz -9. Il est inutile de ne pas utiliser toute la mémoire disponible.

J'utiliserais également le paramètre --extreme pour tester si cela fait une différence.

Taille du dictionnaire

Dans une documentation dont je dispose - site - il est dit que la taille du dictionnaire est à peu près égale à l'utilisation de la mémoire du décompresseur. Et le paramètre -1 signifie un dict de 1 Mo, -6 signifie 10 MiB (ou 8 MiB dans une autre partie du même manuel). C'est pourquoi vous n'obtenez aucun avantage en associant ces fichiers. Utiliser le -9 ferait du décompresseur (et donc du dictionnaire) 64 Mo, et je pense que c'est ce que vous vouliez.

Éditer

Une autre possibilité serait d'utiliser un autre compresseur. J'irais avec 7zip, mais tarerais d'abord ces fichiers puis 7zip.

Selon le contenu de vos fichiers, vous pouvez peut-être utiliser 7zip avec la méthode PPM-D (au lieu de LZMA ou LZMA2, c'est la valeur par défaut et la même que celle utilisée par xz)

Pas bon: Zip (dict = 32kB), Bzip (dict = 900 kB).

woliveirajr
la source
Xz et 7-Zip utilisent tous deux LZMA2, il n'y aurait donc aucun avantage. PPMD est optimisé pour l'extraction d'entropie extrêmement lente mais à taux de compression élevé à partir de supports déjà compressés (par exemple MP3 et vidéo). Il n'est pas particulièrement probable de trouver les grandes similitudes entre les deux fichiers et de les stocker dans le dictionnaire - pas plus que LZMA2.
allquixotic
woliveirajr, qu'en est-il d'utiliser not -1ou -9preset, mais spécifiez dict=64MBor dict=128MBet set mode=fast?
osgx
Utiliser dict = xxMB au lieu de -1 ou -9 irait directement au but, mais comme je ne sais pas comment xz définit d'autres paramètres lorsque vous utilisez simplement -9, je ne sais pas si vous ne manquerez pas quelque chose autre. Je pense que vous êtes dans la bonne direction, et juste des tests vous donneront une réponse précise.
woliveirajr
3
Avec xz --lzma2=dict=128M,mode=fast,mf=hc4 --memory=2Gj'ai pu compresser 250 fichiers (7,5 Go) à 18 Mo archives tar.xz.
osgx
@osgx :) c'est plutôt sympa. Si cela n'a pas pris trop de temps (c.-à-d. Que cela correspond à vos besoins), le problème est résolu! :) Donc, vous avez plus ou moins final_size = 13 Mo + x * 6 Ko.
woliveirajr
9

S'ils sont vraiment similaires à 99% comme vous le dites, vous devriez pouvoir utiliser bsdiff ou un algorithme similaire pour calculer les différences entre les fichiers. La différence est-elle cumulative (c'est-à-dire que chaque fichier diffère un peu plus du premier) ou la différence entre deux fichiers est-elle à peu près la même?

Si ce n'est pas cumulatif, vous devriez pouvoir:

  • Prenez n'importe quel fichier arbitraire comme "référence"
  • Exécuter la bsdiffcomparaison du fichier de référence avec chaque fichier supplémentaire
  • Stockez chaque diff dans un fichier séparé, à côté du fichier de base
  • Exécutez un compresseur comme à xztravers les résultats (la ligne de base + les diffs).

Le résultat devrait être beaucoup plus petit que le simple fait d' xzarchiver toute l'archive.

Vous pouvez ensuite "reconstituer" les fichiers originaux en "appliquant" le diff au-dessus de la ligne de base pour extraire chacun des autres fichiers.

allquixotic
la source
Non cumulable. ("Chaque paire de fichiers
contient
1
Si les différences ne sont pas cumulatives, cela devrait être une bonne application de l' bsdiffalgorithme. Essaie.
allquixotic
Merci pour votre réponse, mais j'ai déjà fait la tâche avec xz: tar c directory|xz --lzma2=dict=128M,mode=fastet supprimé les fichiers d'entrée. En fait, mes fichiers d'entrée étaient du texte, donc je peux même utiliser diff au lieu de bsdiff(qui n'est pas installé sur mon PC).
osgx
5

Vous (I) pouvez utiliser tar avec un archiveur capable de détecter les modèles à longue portée, par exemple, rzip ou lrzip ( Readme ). Les deux utilisent la détection / déduplication de redondance à longue portée, puis rzip utilise bzip2 et lrzip utilise xz (lzma) / ZPAQ:

rzip est un programme de compression, similaire en fonctionnalités à gzip ou bzip2, mais capable de tirer parti des redondances longue distance dans les fichiers, ce qui peut parfois permettre à rzip de produire des taux de compression bien meilleurs que les autres programmes. ... Le principal avantage de rzip est qu'il a un tampon d'historique efficace de 900 Mo. Cela signifie qu'il peut trouver des morceaux correspondants du fichier d'entrée sur d'énormes distances par rapport à d'autres programmes de compression couramment utilisés. Par comparaison, le programme gzip utilise un tampon d'historique de 32 Ko et bzip2 utilise un tampon d'historique de 900 Ko.

lrzip a un tampon plus grand et peut utiliser de nombreux algorithmes de compression (très rapide, rapide, bon et l'un des meilleurs - ZPAQ) après déduplication:

Lrzip utilise une version étendue de rzip qui fait une première passe de réduction de la redondance longue distance. Les modifications lrzip le font évoluer en fonction de la taille de la mémoire.

Les données sont alors soit: 1. compressées par lzma (par défaut) qui donne une excellente compression à environ deux fois la vitesse de compression bzip2 ...

L'autre moyen est d'utiliser bup - programme de sauvegarde avec déduplication au niveau bloc / segment, basé sur git packfile:

Il utilise un algorithme de total de contrôle tournant (similaire à rsync) pour diviser les gros fichiers en morceaux.

osgx
la source