Benzer büyük dosyaları sıkıştırmak


18

Sıkıştırmak istediğim yüzlerce benzer büyük dosyam var (her biri 30 megabayt). Her dosya çifti aynı verilerin% 99'una sahiptir (% 1'den az fark), bu yüzden 40-50 megabayttan fazla arşive sahip olmayı beklemiyorum.

Tek dosya (ile 13-15 MB 30 MB den sıkıştırılmış olabilir xz -1, gz -1, bzip2 -1), ancak iki veya daha fazla dosya sıkıştırma zaman boyutu ile arşiv istiyorum 13-15MB + N*0.3MBN dosya sayısıdır.

tar(Katı arşiv oluşturmak için) ve xz -6(sıkıştırma sözlüğünü bir dosyadan daha büyük olarak tanımlamak için - Güncelleme - bu yeterli değildi! ) Kullanırken , hala boyutta bir arşivim var N*13MB.

Bunu hem düşünüyorum gzipve bzip2onlar Sözlük az 1 mb dan daha var çünkü bana yardımcı olmaz ve benim katran akışı tekrarlar her 30 MB vardır.

Modern Linux'taki sorunumu standart araçlar kullanarak nasıl arşivleyebilirim?

xzHızlı sıkıştırmak için ayar yapmak mümkün , ancak 30-60 MB'den daha büyük sözlük kullanmak mümkün mü ?

Güncelleme : Hile yaptı tar c input_directory | xz --lzma2=dict=128M,mode=fast,mf=hc4 --memory=2G > compressed.tar.xz. Gerekli mf=hc4ve --memory=2Gseçenekler hakkında emin değilim ; ancak dict=128Msözlüğü yeterince büyük (bir dosyadan daha büyük) olacak şekilde ayarlayın ve mode=fastişlemi biraz daha hızlı yapın -e.


Koşu xz -1 --memory=2Gyardımcı olmadı, setten 2 ve 4 dosya üzerinde test edildi.
Mart'ta osgx

Yanıtlar:


12

Bilgileriniz göz önüne alındığında, dosyalarınızın gerçekten% 99 ortak verilere sahip olduğunu ve bunlarda bitişik (veya neredeyse bitişik)% 1 fark olduğunu doğruladığınızı varsayıyorum.

İlk olarak, içindeki dosyaları içeren bir arşiv oluşturmak için tar kullanmalısınız. Testler için, 10 MB'lık bir .tar oluşturacağım, bu yüzden 300MB boyutuna sahip olacaktım.

Daha sonra, xz kullanarak, sözlüğü bir dosyanın boyutundan daha büyük olacak şekilde ayarlamanız gerekir. Bellek kısıtlamalarınız varsa söylemediğiniz için xz -9 ile giderdim. Kullanılabilir tüm belleği kullanmamanın bir anlamı yok.

Fark yaratıp yaratmadığını test etmek için --extreme ön ayarını da kullanırım.

Sözlük boyutu

Kullanabileceğim bir belgede - site - sözlük boyutunun kabaca dekompresör bellek kullanımına eşit olduğu söylenir. -1 parametresi, 1MiB, -6 değeri 10 MiB (veya aynı kılavuzun başka bir bölümünde 8 MiB) anlamına gelir. Bu yüzden bu dosyaları bir araya getirerek avantaj elde edemezsiniz. -9 kullanıldığında, dekompresör (ve böylece sözlük) 64 MiB olur ve bence istediğiniz budur.

Düzenle

Başka bir olasılık başka bir kompresör kullanmak olabilir. Ben 7zip ile gitmek istiyorum, ama önce bu dosyaları tar sonra 7zip onları.

Dosya içeriğinize bağlı olarak, PPM-D yöntemiyle 7zip kullanabilirsiniz (xz tarafından kullanılan ve aynı olan LZMA veya LZMA2 yerine)

İyi değil: Zip (dict = 32kB), Bzip (dict = 900 kB).


Xz ve 7-Zip'in ikisi de LZMA2 kullanıyor, bu yüzden orada hiçbir faydası olmayacak. PPMD, halihazırda sıkıştırılmış ortamlardan (örn. MP3 ve video) aşırı yavaş ancak yüksek sıkıştırma oranlı entropi çıkarımı için optimize edilmiştir. İki dosya arasındaki büyük benzerlikleri bulmak ve bunları sözlükte saklamak özellikle olası değildir - LZMA2'den daha olası değildir.
allquixotic

woliveirajr, -1ya -9önceden ya da önceden ayarlanmış değil, ya da belirtin dict=64MBya da dict=128MBayarlayın mode=fast?
Mart'ta osgx

-1 veya -9 yerine dict = xxMB kullanmak doğrudan noktaya gider, ama sadece -9 kullandığınızda xz'nin diğer parametreleri nasıl ayarladığını bilmediğim için, bir şey kaçırmayacağınızı bilmiyorum Başka. Doğru yönde olduğunuzu düşünüyorum ve sadece test etmek size kesin bir cevap verecektir.
woliveirajr

3
İle xz --lzma2=dict=128M,mode=fast,mf=hc4 --memory=2G250 dosya (7.5 GB) 18 MB tar.xz arşivine sıkıştırabildim.
Mart'ta osgx

@osgx :) bu çok hoş. Çok fazla zaman almadıysa (yani, sizin ihtiyaçlarınıza göre), sorun çözüldü! :) Yani final_size = 13MB + x * 6kB, az çok.
14:14, woliveirajr

9

Söylediğiniz gibi gerçekten% 99 benzerlerse , dosyalar arasındaki farkları hesaplamak için bsdiff veya benzer bir algoritma kullanabilmeniz gerekir . Fark kümülatif midir (yani her dosya birinciden biraz daha farklıdır), ya da iki dosya arasındaki fark hemen hemen aynı mıdır?

Kümülatif değilse, şunları yapabilmeniz gerekir:

  • Herhangi bir keyfi dosyayı "taban çizgisi" olarak kabul edin
  • bsdiffTemel dosyayı her ek dosyayla karşılaştırmayı çalıştırın
  • Her fark, temel dosyanın yanında ayrı bir dosya olarak depolanır
  • xzSonuçlarda olduğu gibi bir kompresör çalıştırın (taban çizgisi + diffs).

Sonuç sadece xzarşivin tamamından çok daha küçük olmalıdır .

Daha sonra, diğer dosyaların her birini elde etmek için taban çizgisinin üst kısmındaki diff'i "uygulayarak" orijinal dosyaları "yeniden oluşturabilirsiniz".


Birikimli değil. ("Her dosya çifti aynı verilerin% 99'una sahiptir ...")
osgx

1
Farklılıklar birikimli değilse, bu bsdiffalgoritmanın iyi bir uygulaması olmalıdır . Bir şans ver.
allquixotic

Cevabınız için teşekkür ederim, ama zaten xz: tar c directory|xz --lzma2=dict=128M,mode=fastve silinen girdi dosyaları ile görev yaptım . Aslında girdi dosyalarım metinti, bu yüzden fark bile kullanabilirsiniz bsdiff(ki benim PC'de yüklü değil).
Mart'ta osgx

5

Siz (I), rzip veya lrzip ( Benioku ) gibi uzun menzilli desen algılayabilen bazı arşivleyicilerle katran kullanabilirsiniz . Her ikisi de uzun menzilli redundency algılama / tekilleştirme kullanır, ardından rzip bzip2 kullanır ve lrzip xz (lzma) / ZPAQ kullanır:

rzip, gzip veya bzip2 işlevine benzer, ancak bazen rzip'in diğer programlardan çok daha iyi sıkıştırma oranları üretmesine izin verebilen dosyalarda uzun mesafeli redund avantajlarından yararlanabilen bir sıkıştırma programıdır. ... rzip'in temel avantajı, 900 Mbaytlık etkili bir tarih tamponuna sahip olmasıdır. Bu, diğer sık ​​kullanılan sıkıştırma programlarına kıyasla büyük mesafelerde giriş dosyasının eşleşen parçalarını bulabileceği anlamına gelir. Karşılaştırma ile gzip programı 32 kbyte geçmiş tampon kullanır ve bzip2 900 kbyte geçmiş tampon kullanır

lrzip daha büyük arabelleklere sahiptir ve tekilleştirmeden sonra birçok sıkıştırma algoritması kullanabilir (çok hızlı, hızlı, iyi ve en iyilerinden biri - ZPAQ):

Lrzip, ilk geçiş uzun mesafe artıklığını azaltan genişletilmiş bir rzip sürümü kullanır. Lrzip değişiklikleri bellek boyutuna göre ölçeklendirir.

Veriler daha sonra şu şekilde olur: 1. bzip2 sıkıştırmasının yaklaşık iki katı hızında mükemmel sıkıştırma sağlayan lzma (varsayılan) ile sıkıştırılır ...

Diğer bir yol ise git packfile dayalı bup - block- / segment-level tekilleştirmeli yedekleme programı kullanmaktır :

Büyük dosyaları parçalar halinde bölmek için bir yuvarlama sağlama toplamı algoritması (rsync'e benzer) kullanır.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.