Bisakah tarring banyak file bersama-sama meningkatkan kompresi dengan alat standar, misalnya gzip, bzip2, xz?
Saya sudah lama berpikir ini adalah masalahnya tetapi tidak pernah mengujinya. Jika kita memiliki 2 salinan file 20Mb yang sama dari byte acak yang ditampung bersama, sebuah program kompresi cerdas yang menyadari hal ini dapat memampatkan seluruh tarball hingga hampir 20 MB.
Saya baru saja mencoba percobaan ini menggunakan gzip, bzip2, dan xz untuk mengkompres 1) file byte acak, 2) tarball dua salinan file itu, dan 3) kucing dua salinan file itu. Dalam semua kasus, kompresi tidak mengurangi ukuran file. Ini diharapkan untuk kasus 1 tetapi untuk kasus 2 dan 3 hasil optimal adalah bahwa file 40 MB dapat menyusut menjadi hampir 20 MB. Itu wawasan yang sulit dilihat oleh program kompresi, terutama karena redundansi jaraknya jauh, jadi saya tidak akan mengharapkan hasil yang sempurna tetapi saya masih mengira akan ada beberapa kompresi.
Uji:
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*
Hasil:
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
Apakah ini umumnya yang harus saya harapkan?
Apakah ada cara untuk meningkatkan kompresi di sini?
sumber
Jawaban:
Anda menghadapi "ukuran blok" kompresor. Sebagian besar program kompresi memecah input menjadi blok dan mengompres setiap blok. Tampaknya ukuran blok bzip hanya mencapai 900K, sehingga tidak akan melihat pola yang membutuhkan waktu lebih dari 900Kb untuk diulang.
http://www.bzip.org/1.0.3/html/memory-management.html
gzip tampaknya menggunakan blok 32K.
Dengan xz Anda beruntung! Dari halaman manual:
jadi "xz -8" akan menemukan pola hingga 32MB, dan "xz -9" hingga pola 64MB. Tetapi berhati-hatilah berapa ram yang diperlukan untuk melakukan kompresi (dan untuk dekompresi) ...
sumber
The acak isi file yang Anda pilih bukan contoh yang baik - tarfiles dikompresi akan lebih besar dari aslinya. Anda akan melihat hal yang sama dengan file dalam format yang sudah dikompresi (banyak format gambar / audio / video, misalnya).
Tetapi, menggabungkan beberapa file dengan konten yang dapat dikompresi biasanya akan menghasilkan ukuran tarfile total yang lebih kecil daripada ketika menaruhnya secara terpisah, terutama ketika isinya serupa (misalnya file log dari program yang sama). Alasannya adalah bahwa beberapa data offset kompresi per-file (seperti susunan pola untuk beberapa algoritma kompresi) dapat dibagikan oleh semua file dalam tarfile yang sama.
sumber
Seperti yang sudah ditunjukkan:
Kasus uji yang lebih baik mungkin ini:
(Catatan: Berharap tidak ada mount di bawah
/usr
!)Anda dapat menggunakan
tar -jcf
kompresi xz sebagai gantinya.Sekarang jika
test2.tar.gz
lebih kecil dari test1.tar.gz, maka tes berhasil (mis. File tarring maka mengompresi lebih baik daripada mengompresi kemudian tarring). Dugaan saya adalah, untuk banyak (yaitu ribuan) file. Kelemahannya adalah kemungkinan akan memakan waktu lebih lama untuk dieksekusi, serta membutuhkan lebih banyak ruang disk, karena harus membangun seluruh file tar terlebih dahulu dan kemudian mengompresnya. Itu sebabnya metode 1 sering digunakan sebagai gantinya, karena kompres setiap file dengan cepat, meskipun mungkin tidak memberikan sekecil tarball.Misalnya, dalam cadangan di luar kantor kami biasanya mencadangkan 4.000.000 file dengan total sekitar 2TB. Jadi metode pertama jauh lebih cepat dan tidak memerlukan disk tambahan 2TB.
sumber
-z
memampatkan arsip (yaitu tar)? Biasanya nama file keluaran denganczf
diakhiri dengan .tar.gz untuk menekankan ini.