Bisakah file tarring meningkatkan kompresi?

9

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?

Praxeolitic
sumber
Kasing uji Anda adalah contoh buruk. Coba lakukan pengujian Anda dengan, katakanlah, sebuah direktori berisi ~ 100 file teks (nyata).
lcd047
Mengapa ini contoh yang buruk? Kami tahu persis apa yang diharapkan. File acak tidak dapat dikompresi dan 2 file acak dapat dikompresi menjadi dua.
Praxeolitic
Isi file "acak" adalah masalah. Mereka tidak tertekan. Gunakan dua file teks besar yang berbeda untuk mendapatkan ide yang lebih baik. Ide terkait di sini adalah "perbedaan kompresi dinormalisasi". Anda dapat melihat ims.cuhk.edu.hk/~cis/2005.4/01.pdf untuk melihat masalah apa yang dapat Anda temui saat melakukan pengujian semacam ini.
Bruce Ediger

Jawaban:

11

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:

   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

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) ...

kebodohan
sumber
1
Yap, xz -8 mengecilkan tarball dan cat dalam pengujian hingga 21M.
Praxeolitic
1
Ada lebih dari itu hanya ukuran blok. Tapi cerita lengkapnya bukanlah sesuatu yang bisa dijelaskan dalam beberapa paragraf di SE.
lcd047
1
@Praxeolitic Kursus tentang kompresi data mungkin membantu.
lcd047
1
@ lcd047 Kompresi adalah topik yang sangat besar tetapi pertanyaannya di sini hanyalah "mengapa tidak melakukan kompres ini" dan jawabannya adalah karena kompresi bekerja pada pola berulang dan pola yang ia inginkan untuk ditemukan membutuhkan waktu lebih lama untuk terulang kembali daripada yang dicari oleh alat apa pun.
dataless
1
Saya juga berpikir itu berguna untuk mengetahui bahwa "-9" pada kebanyakan kompresor baris perintah tidak berarti "berusaha lebih keras untuk menemukan pola", itu berarti "mempertimbangkan ruang pola yang lebih besar".
dataless
2

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.

Dan Cornilescu
sumber
@kos Ini tergantung pada algoritma yang digunakan dan data. 33% yang dikutip untuk kasus yang sangat istimewa. Dengan gzip dan bzip2, saya mengukur 1000 file 1MB yang dihasilkan secara acak, peningkatan <1% pada setiap file.
jofel
2

Seperti yang sudah ditunjukkan:

  1. Menggunakan file acak tidak baik karena sudah mengandung "entropi informasi" maksimum, karena itu tidak akan memampatkan;
  2. Anda perlu mengemas banyak file untuk perbandingan yang adil.

Kasus uji yang lebih baik mungkin ini:

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

(Catatan: Berharap tidak ada mount di bawah /usr!)

Anda dapat menggunakan tar -jcfkompresi xz sebagai gantinya.

Sekarang jika test2.tar.gzlebih 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.

quazza
sumber
Tidak -zmemampatkan arsip (yaitu tar)? Biasanya nama file keluaran dengan czfdiakhiri dengan .tar.gz untuk menekankan ini.
Jari Keinänen