Nicole Hamilton note correctement que gzip
ne trouvera pas de données en double distantes en raison de la petite taille de son dictionnaire.
bzip2
est similaire, car il est limité à 900 Ko de mémoire.
À la place, essayez :
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 de l'ordre de 384 Mo). Le xz
L'utilitaire, qui devrait être installé par défaut sur les distributions Linux les plus récentes, est similaire à gzip
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 le p7zip
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 dans son .7z
format. Cela signifie que si vous souhaitez remplacer tar
avec 7z
, vous obtenez des fichiers identiques dédupliqués. Cependant, 7z ne conserve pas les horodatages, les autorisations ou les xattrs à la nanoseconde, 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 transmettre à un algorithme conventionnel tel que Gzip/Deflate, bzip2, lzop ou LZMA. Pour les exemples de données que vous donnez ici, ce n'est pas nécessaire ; c'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 lzop
compression (très rapide) avec lrzip
, car il n'y a aucun avantage à s'efforcer davantage de compresser des données complètement aléatoires une fois qu'elles ont été dédupliquées.
Bup et Obnam
Puisque vous avez marqué la question de sauvegarde, si votre objectif ici est de sauvegarder des données, envisagez d'utiliser un programme de sauvegarde de déduplication comme Bup ou Obnam.
Gzip gzip est basé sur l'algorithme DEFLATE, qui est une combinaison du codage LZ77 et Huffman. Il s'agit d'un algorithme de compression de données sans perte qui fonctionne en transformant le flux d'entrée en symboles compressés à l'aide d'un dictionnaire construit à la volée et en surveillant les doublons. Mais il ne peut pas trouver de doublons séparés par plus de 32K. Il n'est pas réaliste de s'attendre à ce qu'il détecte les doublons distants de 1 Mo.
gzip
ne trouvera pas de doublons, même xz
avec une taille de dictionnaire énorme ne le sera pas. Ce que vous pouvez faire est d'utiliser mksquashfs
- cela permettra en effet d'économiser l'espace des doublons.
Quelques résultats de tests rapides avec xz
et mksquashfs
avec trois fichiers binaires aléatoires (64 Mo) dont deux identiques :
Configuration :
mkdir test
cd test
dd if=/dev/urandom of=test1.bin count=64k bs=1k
dd if=/dev/urandom of=test2.bin count=64k bs=1k
cp test{2,3}.bin
cd ..
Squashfs :
mksquashfs test/ test.squash
> test.squash - 129M
xz :
XZ_OPT='-v --memlimit-compress=6G --memlimit-decompress=512M --lzma2=preset=9e,dict=512M --extreme -T4 ' tar -cJvf test.tar.xz test/
> test.tar.xz - 193M