GNU/Linux >> Belajar Linux >  >> Linux

Mengapa kompresi Gzip tidak menghilangkan potongan duplikat data?

Nicole Hamilton mencatat dengan benar bahwa gzip tidak akan menemukan data rangkap yang jauh karena ukuran kamusnya yang kecil.

bzip2 serupa, karena dibatasi hingga 900 KB memori.

Sebagai gantinya, coba:

Algoritme LZMA/LZMA2 (xz , 7z )

Algoritme LZMA berada dalam keluarga yang sama dengan Deflate, tetapi menggunakan ukuran kamus yang jauh lebih besar (dapat disesuaikan; standarnya kira-kira 384 MB). xz utilitas, yang harus diinstal secara default pada distro Linux terbaru, mirip dengan gzip dan menggunakan LZMA.

Karena LZMA mendeteksi redundansi jarak jauh, ini akan dapat menghapus duplikat data Anda di sini. Namun, ini lebih lambat dari Gzip.

Pilihan lainnya adalah 7-zip (7z , di p7zip paket), yang merupakan pengarsipan (bukan kompresor aliran tunggal) yang menggunakan LZMA secara default (ditulis oleh pembuat LZMA). Pengarsipan 7-zip menjalankan deduplikasinya sendiri pada tingkat file (melihat file dengan ekstensi yang sama) saat mengarsipkan ke .7z format. Artinya jika Anda bersedia mengganti tar dengan 7z , Anda mendapatkan file identik yang digandakan. Namun, 7z tidak mempertahankan stempel waktu, izin, atau xattr nanodetik, sehingga mungkin tidak sesuai dengan kebutuhan Anda.

lrzip

lrzip adalah kompresor yang memproses data terlebih dahulu untuk menghapus redundansi jarak jauh sebelum memasukkannya ke algoritme konvensional seperti Gzip/Deflate, bzip2, lzop, atau LZMA. Untuk data sampel yang Anda berikan di sini, itu tidak perlu; ini berguna ketika data input lebih besar dari yang dapat ditampung di memori.

Untuk jenis data ini (duplikat potongan yang tidak dapat dimampatkan), Anda harus menggunakan lzop kompresi (sangat cepat) dengan lrzip , karena tidak ada gunanya berusaha lebih keras untuk mengompresi data yang benar-benar acak setelah dihapus duplikatnya.

Bup dan Obnam

Karena Anda menandai cadangan pertanyaan, jika tujuan Anda di sini adalah mencadangkan data, pertimbangkan untuk menggunakan program pencadangan yang menghapus duplikasi seperti Bup atau Obnam.


Gzip gzip didasarkan pada algoritma DEFLATE, yang merupakan kombinasi dari pengkodean LZ77 dan Huffman. Ini adalah algoritme kompresi data lossless yang bekerja dengan mengubah aliran input menjadi simbol terkompresi menggunakan kamus yang dibuat dengan cepat dan mengawasi duplikat. Tetapi tidak dapat menemukan duplikat yang dipisahkan lebih dari 32K. Mengharapkannya menemukan duplikat dengan jarak 1 MB tidaklah realistis.


gzip tidak akan menemukan duplikat, bahkan xz dengan ukuran kamus besar tidak akan. Yang dapat Anda lakukan adalah menggunakan mksquashfs - ini memang akan menghemat ruang duplikat.

Beberapa hasil tes cepat dengan xz dan mksquashfs dengan tiga file biner acak (64MB) yang keduanya sama:

Penyiapan:

mkdir test
cd test
dd if=/dev/urandom of=test1.bin count=64k bs=1k
dd if=/dev/urandom of=test2.bin count=64k bs=1k
cp test{2,3}.bin
cd ..

Squashf:

mksquashfs test/ test.squash
> test.squash - 129M

xz:

XZ_OPT='-v --memlimit-compress=6G --memlimit-decompress=512M --lzma2=preset=9e,dict=512M --extreme -T4 ' tar -cJvf test.tar.xz test/
> test.tar.xz - 193M

Linux
  1. Redis sebagai Cache:Cara Kerja dan Mengapa Menggunakannya

  2. Mengapa Data Penting Dan Bagaimana Cara Melindunginya

  3. Mengapa Bash `(())` tidak berfungsi di dalam `[[]]`?

  1. Mengapa hostname --fqdn tidak berfungsi di komputer Ubuntu saya?

  2. mengapa jembatan linux tidak berfungsi

  3. mysql tidak dimulai setelah merelokasi dir data

  1. Kompres file saat membaca data dari STDIN

  2. Mengapa xargs -L menghasilkan format yang benar, sedangkan xargs -n tidak?

  3. Mengapa menggunakan innodb_file_per_table?