Je viens de faire une petite expérience où j'ai créé une archive tar avec des fichiers en double pour voir si elle serait compressée, à ma grande admiration, ce n'était pas le cas! Les détails suivent (résultats en retrait pour le plaisir de lire):
$ dd if=/dev/urandom bs=1M count=1 of=a
1+0 records in
1+0 records out
1048576 bytes (1.0 MB) copied, 0.114354 s, 9.2 MB/s
$ cp a b
$ ln a c
$ ll
total 3072
-rw-r--r-- 2 guido guido 1048576 Sep 24 15:51 a
-rw-r--r-- 1 guido guido 1048576 Sep 24 15:51 b
-rw-r--r-- 2 guido guido 1048576 Sep 24 15:51 c
$ tar -c * -f test.tar
$ ls -l test.tar
-rw-r--r-- 1 guido guido 2109440 Sep 24 15:51 test.tar
$ gzip test.tar
$ ls -l test.tar.gz
-rw-r--r-- 1 guido guido 2097921 Sep 24 15:51 test.tar.gz
$
J'ai d'abord créé un fichier 1 Mo de données aléatoires (a). Ensuite, je l'ai copié dans un fichier b et l'ai également lié à c. Lors de la création de l'archive tar, tar était apparemment au courant du lien dur, car l'archive tar n'était que de ~ 2 Mo et non de ~ 3Mib.
Maintenant, je m'attendais à ce que gzip réduise la taille de l'archive tar à ~ 1 Mo, car a et b sont des doublons, et il devrait y avoir 1 Mo de données continues répétées à l'intérieur de l'archive, mais cela ne s'est pas produit.
Pourquoi est-ce? Et comment pourrais-je compresser efficacement l'archive tar dans ces cas?
la source
xz -9 -M 95%
, ou mêmexz -M 95% --lzma2=preset=9,dict=1610612736
. Ce ne sera pas rapide, mais vos doublons ne resteront probablement pas dans le résultat.Nicole Hamilton note correctement que
gzip
ne trouvera pas de données en double éloignées en raison de la petite taille de son dictionnaire.bzip2
est similaire, car il est limité à 900 Ko de mémoire.Essayez plutôt:
Algorithme LZMA / LZMA2 (
xz
,7z
)L'algorithme LZMA appartient à la même famille que Deflate, mais utilise une taille de dictionnaire beaucoup plus grande (personnalisable; la valeur par défaut est d'environ 384 Mo). L'
xz
utilitaire, qui devrait être installé par défaut sur les distributions Linux les plus récentes, est similairegzip
et utilise LZMA.Comme LZMA détecte une redondance à plus longue portée, il pourra dédupliquer vos données ici. Cependant, il est plus lent que Gzip.
Une autre option est 7-zip (
7z
, dans lep7zip
package), qui est un archiveur (plutôt qu'un compresseur à flux unique) qui utilise LZMA par défaut (écrit par l'auteur de LZMA). L'archiveur 7-zip exécute sa propre déduplication au niveau du fichier (en regardant les fichiers avec la même extension) lors de l'archivage à son.7z
format. Cela signifie que si vous êtes prêt à remplacertar
avec7z
, vous obtenez des fichiers identiques dédupliquées. Cependant, 7z ne conserve pas les horodatages, les autorisations ou les xattrs en nanosecondes, il peut donc ne pas répondre à vos besoins.lrzip
lrzip
est un compresseur qui pré-traite les données pour supprimer la redondance longue distance avant de les alimenter à un algorithme conventionnel comme Gzip / Deflate, bzip2, lzop ou LZMA. Pour les exemples de données que vous donnez ici, ce n'est pas nécessaire; il est utile lorsque les données d'entrée sont plus grandes que ce qui peut tenir en mémoire.Pour ce type de données (morceaux incompressibles dupliqués), vous devez utiliser la
lzop
compression (très rapide) aveclrzip
, car il n'y a aucun avantage à essayer plus fort de compresser des données complètement aléatoires une fois qu'elles sont dédupliquées.Bup et Obnam
Depuis que vous avez marqué la sauvegarde de la question , si votre objectif ici est de sauvegarder des données, envisagez d'utiliser un programme de sauvegarde avec déduplication comme Bup ou Obnam .
la source
Dans le cas d'une sauvegarde, éventuellement avec un ensemble plus large de fichiers plus petits, une astuce qui pourrait fonctionner pour vous est de trier les fichiers dans le tar par extension:
la source
rev
(pourquoi même inverser puis trier?) Et regarder l'sort
option "-r, --reverse" (même si je ne sais pas pourquoi vous voudriez même inverser). Mais je pense que votretar
option "-I
" ne fait pas ce que vous pensez "-I, --use-compress-program PROG
" , vous voulez probablement "-T, --files-from FILE"| tar czf my_archive.tar.gz -I -
devrait être| xargs tar Azf my_archive.tar.gz
rev
inverse l'ordre des caractères dans chaque ligne, pas l'ordre des lignes dans le flux. Pour cette raison,sort
regroupe les fichiers par leur extension. Je soupçonne que le-I -
devrait avoir été-T -
, qui fournit la liste des fichiers sur stdin.rev
serait en quelque sorte arrangé par extension, pas qu'il y ait de nombreuses extensions sous Linux de toute façon. J'imagine que le tri par taille aurait plus de chances de trouver des dupgzip
ne trouvera pas de doublons, mêmexz
avec une énorme taille de dictionnaire. Ce que vous pouvez faire, c'est utilisermksquashfs
- cela permettra en effet d'économiser l'espace des doublons.Quelques résultats de tests rapides avec
xz
etmksquashfs
avec trois fichiers binaires aléatoires (64 Mo) dont deux identiques:Installer:
Squashfs:
xz:
la source
Number of duplicate files found
in stdout.Sur mon système, le
lzma test.tar
fichier test.tar.lzma de 106'3175 octets (1,1 Mo)la source
En complément de la réponse de l'escargot mécanique:
Même xz (ou lzma) ne trouvera pas de doublons si la taille du fichier unique non compressé (ou, plus précisément, la distance entre les doublons) dépasse la taille du dictionnaire. xz (ou lzma) même sur le réglage le plus élevé
-9e
ne réserve que 64 Mo pour cela.Heureusement, vous pouvez spécifier votre propre taille de dicton avec l'option
--lzma2=dict=256MB
(uniquement--lzma1=dict=256MB
autorisé lorsque vous utilisez l'alias lzma pour la commande)Malheureusement, lors de la substitution des paramètres avec des chaînes de compression personnalisées comme indiqué dans l'exemple ci-dessus, les valeurs par défaut pour tous les autres paramètres ne sont pas définies au même niveau qu'avec -9e. La densité de compression n'est donc pas aussi élevée pour des fichiers uniques.
la source
gzip sans commutateurs de ligne de commande utilise l'algorithme le plus bas possible pour la compression.
Essayez d'utiliser:
Vous devriez obtenir de meilleurs résultats
la source