Чи може націлювання на пучок файлів разом покращити стиснення зі стандартними інструментами, наприклад, gzip, bzip2, xz?
Я давно вважав, що це так, але ніколи цього не перевіряв. Якщо у нас є 2 копії одного і того ж 20 Мбіт-файлу випадкових байтів, націлених разом, розумна програма стиснення, яка розуміє це, може стиснути весь тарбол майже до 20 Мбіт.
Я просто спробував цей експеримент, використовуючи gzip, bzip2 та xz для стиснення 1) файлу випадкових байтів, 2) тарболу з двох копій цього файлу та 3) кота з двох копій цього файлу. У всіх випадках стиснення не зменшило розмір файлу. Це очікується для випадку 1, але для 2 та 3 випадків оптимальним результатом є те, що файл 40Mb може бути скорочений до майже 20Mb. Це складно зрозуміти для програми стиснення, тим більше, що надмірність віддалена, тому я не очікував ідеального результату, але все ж я вважав, що буде стиснення.
Тест:
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*
Результат:
20+0 records in
20+0 records out
20971520 bytes (21 MB) copied, 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
Це взагалі те, що я повинен очікувати?
Чи є тут спосіб поліпшити компресію?