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