Katran dosyaları sıkıştırmayı iyileştirebilir mi?


9

Bir grup dosyayı birlikte tarring, gzip, bzip2, xz gibi standart araçlarla sıkıştırmayı iyileştirebilir mi?

Uzun zamandır bunun böyle olduğunu düşündüm ama asla test etmedim. Aynı 20Mb'lık rastgele bayt dosyasının birlikte kopyalanmış 2 kopyasına sahipsek, bunun gerçekleşen akıllı bir sıkıştırma programı tüm tarball'ı neredeyse 20Mb'ye kadar sıkıştırabilir.

Bu denemeyi gzip, bzip2 ve xz kullanarak 1) rastgele bayt dosyası, 2) o dosyanın iki kopyasından oluşan bir tarball ve 3) o dosyanın iki kopyasından oluşan bir kedi sıkıştırmak için denedim. Her durumda, sıkıştırma dosya boyutunu azaltmadı. Bu durum durum 1 için beklenmektedir, ancak durum 2 ve 3 için en iyi sonuç 40 MB'lık bir dosyanın yaklaşık 20 MB'a küçültülebilmesidir. Bir sıkıştırma programının görmesi zor, özellikle fazlalık uzak olduğu için mükemmel bir sonuç beklemiyordum ama yine de biraz sıkıştırma olacağını düşündüm.

Ölçek:

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*

Sonuç:

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

Genel olarak beklediğim bu mu?

Burada sıkıştırmayı iyileştirmenin bir yolu var mı?


Test durumlarınız kötü örneklerdir. Testinizi, örneğin, ~ 100 (gerçek) metin dosyası dizini ile yapmayı deneyin.
lcd047

Neden kötü bir örnek? Ne olacağını tam olarak biliyoruz. Rastgele bir dosya sıkıştırılamaz ve rastgele bir dosyadan 2 tanesi yarıya kadar sıkıştırılabilir.
Praxeolitic

"Rastgele" dosya içeriği bir sorundur. Sıkıştırılamazlar. Daha iyi bir fikir edinmek için iki farklı büyük metin dosyası kullanın. Burada ilgili bir fikir "normalleştirilmiş sıkıştırma farkı" dır. Bu tür bir test yaparken ne tür sorunlarla karşılaşabileceğinizi görmek için ims.cuhk.edu.hk/~cis/2005.4/01.pdf adresine bakabilirsiniz .
Bruce Ediger

Yanıtlar:


11

Kompresörün "blok boyutuna" karşısınız. Çoğu sıkıştırma programı girişi bloklara böler ve her bloğu sıkıştırır. Görünüşe göre bzip blok boyutu sadece 900K'a kadar çıkıyor, bu yüzden tekrarlanması 900K bayttan daha uzun süren bir desen görmeyecek.

http://www.bzip.org/1.0.3/html/memory-management.html

gzip 32K blok kullanıyor gibi görünüyor.

Xz ile şanslısın! Man sayfasından:

   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

"xz -8" en fazla 32MB kalıp ve "xz -9" en fazla 64MB kalıp bulacaktır. Ancak sıkıştırmayı (ve sıkıştırmayı) gerçekleştirmek için ne kadar koç gerektirdiğine dikkat edin ...


1
Evet, xz -8 testteki tarball ve kediyi 21M'ye küçültür.
Praxeolitic

1
Sadece blok boyutundan daha fazlası var. Ancak hikayenin tamamı SE hakkında birkaç paragrafta açıklanabilecek bir şey değil.
lcd047

1
@Praxeolitic Veri sıkıştırma üzerine bir kurs yardımcı olabilir.
lcd047

1
@ lcd047 Sıkıştırma çok büyük bir konu ama buradaki soru sadece "neden bu sıkıştırmayı yapmadı" idi ve cevap, tekrar eden kalıplarda sıkıştırma çalışması ve bulmasını istediği modelin herhangi bir aracın aradığından daha uzun sürmesi.
dataless

1
Çoğu komut satırı kompresöründe "-9" un "örüntü bulmak için daha fazla uğraş" anlamına gelmediğini, "daha büyük örüntü boşluklarını düşün" anlamına geldiğini bilmek yararlı olduğunu düşünüyorum.
dataless

2

Rastgele seçtiğiniz dosya içeriği iyi bir örnek değil - Sıkıştırılmış tarfiles olacak büyük orijinallerinden daha. Aynı şeyi zaten sıkıştırılmış biçimlerde (örneğin, birçok görüntü / ses / video biçimi) görürsünüz.

Ancak, sıkıştırılabilir içeriğe sahip birden fazla dosyanın birlikte taring edilmesi, genellikle ayrı ayrı taring işleminden, özellikle de içerik benzer olduğunda (örneğin aynı programdaki günlük dosyaları) genellikle daha küçük toplam tarfile boyutu üretir. Bunun nedeni, dosya başına sıkıştırma ofset verilerinin bir kısmının (bazı sıkıştırma algoritmaları için desen dizileri gibi) aynı tarfile'deki tüm dosyalar tarafından paylaşılabilmesidir.



@kos Bu, kullanılan algoritmaya ve verilere bağlıdır. Belirtilen% 33 çok özel bir durum içindir. Gzip ve bzip2 ile, rastgele oluşturulan 1000 MB'lık her dosya için <% 1'lik bir artış ölçtüm .
jofel

2

Daha önce belirtildiği gibi:

  1. Zaten maksimum "bilgi entropisi" içerdiklerinden rastgele dosyalar kullanmak iyi değildir, bu nedenle sıkıştırmazlar;
  2. Adil bir karşılaştırma için çok sayıda dosya paketlemeniz gerekir .

Daha iyi bir test durumu şu olabilir:

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

(Not: Altında montaj yok /usr!)

Bunun tar -jcfyerine xz sıkıştırması için kullanabilirsiniz .

Şimdi test2.tar.gztest1.tar.gz'den daha küçükse, o zaman test başarılıdır (yani, dosyaları tarring sonra sıkıştırmak sıkıştırmaktan sonra tarring'den daha iyidir). Tahminimce bir sürü dosya (binlerce) olacak. Dezavantajı, ilk önce tüm tar dosyasını oluşturup daha sonra sıkıştırması gerektiğinden, yürütülmesi potansiyel olarak daha uzun sürecek ve daha fazla disk alanı gerektirecektir. Bu nedenle, 1. yöntem genellikle küçük bir tarball vermese de, her dosyayı anında sıkıştırdığı için sıklıkla kullanılır.

Örneğin, site dışı yedeklememizde genellikle toplamda yaklaşık 2 TB olan 4.000.000 dosya yedekleniyoruz. İlk yöntem çok daha hızlıdır ve ek 2 TB disk gerektirmez.


Arşivi (yani katranı) -zsıkıştırmıyor mu ? Genellikle çıktı dosya adı .tar.gz ile biter. czf
Jari Keinänen
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.