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.3MB
où 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 gzip
et bzip2
ne 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 xz
pour 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=hc4
et des --memory=2G
options; mais dict=128M
définissez le dictionnaire pour qu'il soit suffisamment grand (plus grand qu'un fichier) et mode=fast
accélérez le processus plus rapidement que -e
.
la source
xz -1 --memory=2G
n'a pas aidé, testé sur 2 et 4 fichiers de l'ensemble.Réponses:
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).
la source
-1
ou-9
preset, mais spécifiezdict=64MB
ordict=128MB
et setmode=fast
?xz --lzma2=dict=128M,mode=fast,mf=hc4 --memory=2G
j'ai pu compresser 250 fichiers (7,5 Go) à 18 Mo archives tar.xz.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:
bsdiff
comparaison du fichier de référence avec chaque fichier supplémentairexz
travers les résultats (la ligne de base + les diffs).Le résultat devrait être beaucoup plus petit que le simple fait d'
xz
archiver 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.
la source
bsdiff
algorithme. Essaie.tar c directory|xz --lzma2=dict=128M,mode=fast
et 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 debsdiff
(qui n'est pas installé sur mon PC).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:
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:
L'autre moyen est d'utiliser bup - programme de sauvegarde avec déduplication au niveau bloc / segment, basé sur git packfile:
la source