Les bitmaps peuvent-ils améliorer la compression?

Peut garrer un tas de files set améliorer la compression avec les outils standard, par exemple gzip, bzip2, xz?

J'ai longtime pensé que c'était le cas mais jamais testé. Si nous avons 2 copys du même file d'octets randoms de 20Mb, un programme de compression intelligent qui réalise cela pourrait compresser l'archive entière jusqu'à presque 20Mb.

J'ai juste essayé cette expérience en utilisant gzip, bzip2 et xz pour compresser 1) un file d'octets randoms, 2) une archive de deux copys de ce file et 3) un chat de deux copys de ce file. Dans tous les cas, la compression n'a pas réduit la taille du file. Ceci est attendu pour le cas 1, mais pour les cas 2 et 3, le résultat optimal est qu'un file de 40Mo peut être réduit à près de 20Mb. C'est un aperçu difficile pour un programme de compression à voir, surtout parce que la redondance est lointaine, donc je ne m'attendrais pas à un résultat parfait, mais j'avais toujours pensé qu'il y aurait une certaine compression.

Tester:

dd if=/dev/urandom of=random1.txt bs=1M count=20 cp random1.txt random2.txt cat random1.txt random2.txt > random_cat.txt tar -cf randoms.tar random1.txt random2.txt gzip -k random* & bzip2 -k random* & xz -k random* & wait du -sh random* 

Résultat:

 20+0 records in 20+0 records out 20971520 bytes (21 MB) copyd, 1.40937 s, 14.9 MB/s [1] Done gzip -k random* [2]- Done bzip2 -k random* [3]+ Done xz -k random* 20M random1.txt 21M random1.txt.bz2 21M random1.txt.gz 21M random1.txt.xz 20M random2.txt 21M random2.txt.bz2 21M random2.txt.gz 21M random2.txt.xz 40M random_cat.txt 41M random_cat.txt.bz2 41M random_cat.txt.gz 41M random_cat.txt.xz 41M randoms.tar 41M randoms.tar.bz2 41M randoms.tar.gz 41M randoms.tar.xz 

Est-ce généralement ce à quoi je devrais m'attendre?

Y a-t-il un moyen d'améliorer la compression ici?

Vous êtes contre la "taille de bloc" du compresseur. La plupart des programmes de compression cassent l'input en blocs et compressent chaque bloc. Il semble que la taille du bloc bzip ne va jusqu'à 900K, donc il ne verra pas de model qui prend plus de 900K octets pour répéter.

http://www.bzip.org/1.0.3/html/memory-management.html

gzip semble utiliser des blocs de 32 Ko.

Avec xz, vous avez de la chance! De la page de manuel:

  Preset DictSize CompCPU CompMem DecMem -0 256 KiB 0 3 MiB 1 MiB -1 1 MiB 1 9 MiB 2 MiB -2 2 MiB 2 17 MiB 3 MiB -3 4 MiB 3 32 MiB 5 MiB -4 4 MiB 4 48 MiB 5 MiB -5 8 MiB 5 94 MiB 9 MiB -6 8 MiB 6 94 MiB 9 MiB -7 16 MiB 6 186 MiB 17 MiB -8 32 MiB 6 370 MiB 33 MiB -9 64 MiB 6 674 MiB 65 MiB 

donc "xz -8" finda jusqu'à 32 Mo de motifs et "xz -9" jusqu'à 64 Mo de motifs. Mais méfiez-vous de la quantité de RAM nécessaire pour effectuer la compression (et pour décompresser) …

Le contenu du file random que vous avez choisi n'est pas un bon exemple: les files tar compressés seront plus volumineux que les originaux. Vous verrez la même chose avec les files qui compressent déjà les formats (de nombreux formats image / audio / video, par exemple).

Cependant, tarer set plusieurs files avec du contenu compressible produirait généralement une taille de file tarfile plus petite que lors de leur tarification séparée, en particulier lorsque le contenu est similaire (par exemple les files journaux du même programme). La raison en est que certaines des données de décalage de compression par file (comme les arrays de motifs pour certains algorithms de compression) peuvent être partagées par tous les files du même file tar.

Comme déjà indiqué:

  1. L'utilisation de files randoms n'est pas bonne, car ils contiennent déjà une «entropie d'information» maximale, et ne se compriment donc pas;
  2. Vous devez emballer beaucoup de files pour une comparaison équitable.

Un meilleur cas de test pourrait être ceci:

 cd /var/tmp tar -zcf test1.tar /usr tar -cf test2.tar /usr gzip test2.tar ls -h 

(Note: En espérant qu'il n'y a pas de assemblys sous /usr !)

Vous pouvez utiliser tar -jcf pour la compression xz à la place.

Maintenant, si test2.tar.gz est plus petit que test1.tar.gz, alors le test est réussi (c'est-à-dire que les files sont compressés alors que la compression est meilleure que la compression puis le bitumage). Je suppose que ce sera pour beaucoup (c'est-à-dire des milliers) de files. L'inconvénient est qu'il prendra potentiellement plus de time à s'exécuter, tout en nécessitant beaucoup plus d'espace disque, puisqu'il doit tout d'abord build le file tar, puis le compresser. C'est la raison pour laquelle la 1ère méthode est souvent utilisée à la place, car elle compresse chaque file à la volée, même s'il ne donne pas une archive tar aussi petite.

Par exemple, dans notre sauvegarde hors site, nous sauvegardons généralement 4 000 000 de files totalisant environ 2 To. La première méthode est donc beaucoup plus rapide et ne nécessite pas un disque supplémentaire de 2 To.