Có thể tarring một loạt các tập tin cùng nhau cải thiện nén với các công cụ tiêu chuẩn, ví dụ như gzip, bzip2, xz?
Tôi từ lâu đã nghĩ đây là trường hợp nhưng chưa bao giờ thử nghiệm nó. Nếu chúng ta có 2 bản sao của cùng một tệp 20Mb các byte ngẫu nhiên được ghép với nhau, một chương trình nén thông minh nhận ra điều này có thể nén toàn bộ tarball xuống gần 20Mb.
Tôi vừa thử thí nghiệm này bằng cách sử dụng gzip, bzip2 và xz để nén 1) tệp byte ngẫu nhiên, 2) tarball gồm hai bản sao của tệp đó và 3) một con mèo gồm hai bản sao của tệp đó. Trong mọi trường hợp, việc nén không làm giảm kích thước tệp. Điều này được mong đợi cho trường hợp 1 nhưng đối với trường hợp 2 và 3, kết quả tối ưu là một tệp 40Mb có thể được thu nhỏ lại gần 20Mb. Đó là một cái nhìn sâu sắc khó hiểu cho một chương trình nén, đặc biệt là vì sự dư thừa là rất xa, vì vậy tôi sẽ không mong đợi một kết quả hoàn hảo nhưng tôi vẫn cho rằng sẽ có một số nén.
Kiểm tra:
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*
Kết quả:
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
Đây có phải là những gì tôi nên mong đợi?
Có cách nào để cải thiện nén ở đây?