Saya memiliki ratusan file besar yang serupa (masing-masing 30 megabyte) yang ingin saya kompres. Setiap pasangan file memiliki 99% data yang sama (perbedaan kurang dari 1%), jadi saya berharap tidak lebih dari 40-50 megabyte arsip.
File tunggal dapat dikompresi dari 30 MB ke 13-15 MB (dengan xz -1
, gz -1
, bzip2 -1
), tetapi ketika mengompresi dua atau lebih file saya ingin memiliki arsip dengan ukuran 13-15MB + N*0.3MB
di mana N adalah jumlah file.
Saat menggunakan tar
(untuk membuat arsip padat) dan xz -6
(untuk menentukan kamus kompresi menjadi lebih besar dari satu file - Perbarui - ini tidak cukup! ), Saya masih memiliki arsip dengan ukuran N*13MB
.
Saya pikir keduanya gzip
dan bzip2
tidak akan membantu saya karena mereka memiliki kamus kurang dari 1 MB, dan aliran tar saya memiliki pengulangan setiap 30 MB.
Bagaimana saya bisa mengarsipkan masalah saya di Linux modern menggunakan alat standar?
Apakah mungkin untuk menyetel xz
kompres dengan cepat, tetapi gunakan kamus yang lebih besar dari 30-60 MB?
Pembaruan : Melakukan trik dengan tar c input_directory | xz --lzma2=dict=128M,mode=fast,mf=hc4 --memory=2G > compressed.tar.xz
. Tidak yakin tentang perlunya mf=hc4
dan --memory=2G
opsi; tetapi dict=128M
atur kamus menjadi cukup besar (lebih besar dari satu file), dan mode=fast
buat prosesnya lebih cepat dari -e
.
sumber
xz -1 --memory=2G
tidak membantu, diuji pada 2 dan 4 file dari set.Jawaban:
Dengan perincian Anda, saya berasumsi bahwa Anda telah memverifikasi bahwa file Anda benar-benar memiliki 99% data yang sama, dengan perbedaan 1% yang berdekatan (atau hampir bersebelahan).
Pertama, Anda harus menggunakan tar untuk membuat satu arsip dengan file Anda di dalamnya. Untuk tes, saya akan membuat .tar dengan 10 file, sehingga memiliki ukuran 300MB.
Kemudian, menggunakan xz, Anda harus mengaturnya sehingga kamus lebih besar dari ukuran satu file. Karena Anda tidak mengatakan jika Anda memiliki batasan memori, saya akan menggunakan xz -9. Tidak ada gunanya tidak menggunakan semua memori yang tersedia.
Saya juga menggunakan preset --extreme, untuk menguji apakah ada bedanya.
Ukuran kamus
Dalam satu dokumentasi yang saya miliki - situs - dikatakan bahwa ukuran kamus kira-kira sama dengan penggunaan memori dekompresor. Dan parameter -1 berarti dict dari 1MiB, -6 berarti 10 MiB (atau 8 MiB di bagian lain dari manual yang sama). Itu sebabnya Anda tidak mendapatkan keuntungan apa pun dengan menggabungkan file-file itu bersama-sama. Menggunakan -9 akan membuat pengurai (dan, jadi, kamus) menjadi 64 MIB, dan saya pikir itulah yang Anda inginkan.
Edit
Kemungkinan lain akan menggunakan kompresor lain. Saya akan pergi dengan 7zip, tetapi akan tar file-file itu terlebih dahulu dan kemudian 7zip mereka.
Bergantung pada konten file Anda, mungkin Anda bisa menggunakan 7zip dengan metode PPM-D (bukan LZMA atau LZMA2, itu adalah default dan sama dengan yang digunakan oleh xz)
Tidak bagus: Zip (dikt = 32kB), Bzip (dikt = 900 kB).
sumber
-1
atau-9
preset, tetapi tentukandict=64MB
ataudict=128MB
dan aturmode=fast
?xz --lzma2=dict=128M,mode=fast,mf=hc4 --memory=2G
saya dapat mengkompres 250 file (7,5 GB) ke arsip tar.xz 18 MB.Jika mereka benar-benar 99% mirip seperti yang Anda katakan, Anda harus dapat menggunakan bsdiff atau algoritma serupa untuk menghitung perbedaan antara file. Apakah perbedaannya kumulatif (yaitu, setiap file sedikit berbeda dari yang pertama), atau apakah perbedaan antara dua file hampir sama?
Jika tidak kumulatif, Anda harus dapat:
bsdiff
membandingkan file baseline ke setiap file tambahanxz
melintasi hasil (baseline + diff).Hasilnya harus jauh lebih kecil daripada hanya
xz
seluruh arsip.Anda kemudian dapat "menyusun kembali" file asli dengan "menerapkan" diff di atas baseline untuk mengeluarkan masing-masing file lainnya.
sumber
bsdiff
algoritma yang baik. Cobalah.tar c directory|xz --lzma2=dict=128M,mode=fast
dan menghapus file input. Sebenarnya file input saya adalah teks, jadi saya bahkan dapat menggunakan diff bukanbsdiff
(yang tidak diinstal pada PC saya).Anda (saya) dapat menggunakan tar dengan beberapa pengarsip yang mampu mendeteksi pola jarak jauh, misalnya, rzip atau lrzip ( Readme ). Keduanya menggunakan deteksi / deduplikasi redundensi jarak jauh, kemudian rzip menggunakan bzip2 dan lrzip menggunakan xz (lzma) / ZPAQ:
lrzip memiliki buffer yang lebih besar dan dapat menggunakan banyak algoritma kompresi (sangat cepat, cepat, bagus, dan salah satu yang terbaik - ZPAQ) setelah deduplikasi:
Cara lain adalah menggunakan bup - program cadangan dengan deduplikasi tingkat blok / segmen, berdasarkan git packfile:
sumber