Neden tar arşiv formatları bzip2 yerine xz sıkıştırmasına geçiyor, peki ya gzip?


202

Gittikçe daha fazla tararşiv xz, geleneksel bzip2(bz2)sıkıştırma yerine sıkıştırma için LZMA2'yi temel alan formatı kullanır . Aslında, kernel.org geç saatlerde " Güle güle bzip2 " duyurusunu yaptı, 27 Aralık 2013'te , çekirdek kaynaklarının bu noktadan itibaren hem tar.gz hem de tar.xz formatında yayınlanacağını belirterek - ve web sitesinin ana sayfasında doğrudan sunulanlar içeride tar.xz.

Bunun neden olduğunu ve gzipbu bağlamda ilgisinin ne olduğunu açıklayan herhangi bir özel sebep var mı?

history  gzip  bzip2  xz 

Yanıtlar:


198

Arşivleri İnternet üzerinden dağıtmak için aşağıdakiler genellikle bir önceliktir:

  1. Sıkıştırma oranı (yani, kompresörün verileri ne kadar küçük yaptığı);
  2. Dekompresyon zamanı (CPU gereksinimleri);
  3. Dekompresyon belleği gereksinimleri; ve
  4. Uyumluluk (dekompresyon programının ne kadar yaygın olduğu)

Sıkıştırma belleği ve CPU gereksinimleri çok önemli değil, çünkü bunun için büyük bir hızlı makine kullanabilirsiniz ve sadece bir kez yapmanız gerekir.

Bzip2 ile karşılaştırıldığında, xz daha iyi bir sıkıştırma oranına ve daha düşük (daha iyi) dekompresyon süresine sahiptir. Bununla birlikte - tipik olarak kullanılan sıkıştırma ayarlarında - [1] kodunu açmak için daha fazla bellek gerektirir ve biraz daha az yaygındır. Gzip ikisinden de daha az bellek kullanır.

Böylece, hem gzip hem de xz formatındaki arşivler gönderilir ve bunlar şunları seçmenize izin verir:

  • Çok sınırlı belleğe (<32 MB) sahip bir makinenin sıkıştırmasını açmanız gerekir: gzip. Çekirdek kaynakları hakkında konuşurken verilen, pek olası değildir.
  • Mevcut minimum araçları açmanız gerekir: gzip
  • İndirme zamanından ve / veya bant genişliğinden tasarruf etmek ister: xz

Gerçekten bzip2'yi seçmenize neden olacak faktörlerin gerçekçi bir birleşimi yoktur. Böylece aşamalı.

Bir blog gönderisindeki sıkıştırma karşılaştırmalarına baktım . Sonuçları çoğaltma girişiminde bulunmadım ve bir kısmının değiştiğinden şüpheliyim (çoğunlukla, xzen yeni haliyle geliştiğini umuyorum).

(İyi bir bzip2 uygulamasının xz için tercih edilebileceği bazı özel senaryolar vardır: bzip2, xz'den daha iyi sayıda sıfır ve genom DNA sekansı olan bir dosyayı sıkıştırabilir. bozulması ve paralel sıkıştırma ve [teoride] dekompresyon noktadan sonra. Daha önce, sadece, bzip2 bu verdi. [2] bu ancak her biri çekirdek dağılımı hakkında olan)


1: Arşiv boyutunda, xz -3civarında bzip -9. Sonra xz sıkıştırmasını açmak için daha az bellek kullanır. Ancak xz -9(örneğin, Linux çekirdek tarball'ları için kullanıldığı gibi) çok daha fazlasını kullanır bzip -9. (Ve hatta xz -0daha fazlasına ihtiyacı var gzip -9).

2: F21 Sistem Çapında Değişim: varsayılan bzip2 uygulaması olarak lbzip2


Hata toleransı konusundaki herhangi bir yorum veya sıkıştırma algoritmaları dışında her zaman tamamen uygulanan bir şey mi?

1
@ illuminÉ esnekliği, sıkıştırma oranından ödün vermeden sağlanamaz. Bu ortogonal bir sorundur ve Parchive gibi araçlar varken, çekirdek TCP'nin hata işlemesini dağıtmak için aynı işi yapar.
Tobu

2
@ illuminÉ Hata toleransı (par2'ye benzer bir şey demek istediğinizi varsayarsak) normalde arşivleri İnternet üzerinden dağıtmakla ilgili bir sorun değildir. Yüklemeler yeterince güvenilir kabul edilir (ve bozuksa yeniden indirebilirsiniz). Şifreleme karmaları ve imzaları sıklıkla kullanılır ve kurcalanmanın yanı sıra bozulmayı da algılar. Sıkıştırma oranı maliyeti olsa da, daha büyük hata toleransı veren kompresörler vardır. Hiç kimse HTTP ya da FTP indirmeleri için buna değecek bir takas bulmuyor gibi görünüyor.
derobert

xz, sıkıştırmasını açmak için LESS belleği kullanır.
MichalH

@Mike Bunu yazdığımdan beri değişti mi? Özellikle, bir dipnot hafıza kullanımını açıklar.
derobert

45

Her şeyden önce, bu soru doğrudan ilgili değil tar. Tar sadece sıkıştırılmamış bir arşiv oluşturur, daha sonra sıkıştırma uygulanır.

Gzip'in LZMA2 ve bzip2'ye kıyasla nispeten hızlı olduğu bilinmektedir. Hız önemliyse, gzip(özellikle çok iş parçacıklı uygulama pigz) sıkıştırma hızı ve sıkıştırma oranı arasında genellikle iyi bir uzlaşmadır. Hızın bir sorun olması durumunda alternatifler olmasına rağmen (örn. LZ4).

Bununla birlikte, eğer yüksek bir sıkıştırma oranı istenirse, LZMA2 bzip2hemen hemen her açıdan atmaktadır . Sıkıştırma hızı genellikle daha yavaştır, ancak çok daha hızlı bir şekilde açılır ve daha yüksek bellek kullanımı pahasına daha iyi bir sıkıştırma oranı sağlar.

bzip2Geriye dönük uyumluluk dışında, artık kullanmak için fazla bir neden yoktur . Dahası, LZMA2'nin çoklu okuma akılda tutulması isteniyordu ve birçok uygulama varsayılan olarak çok çekirdekli işlemcileri kullanıyor (ne yazık ki xzLinux'ta bunu yapmıyor). Bu, saat hızlarının artmayacağından çekirdeğin sayısı artacağı için anlamlıdır.

Çok iş parçacıklı bzip2uygulamalar var (örn. pbzip), Ancak bunlar genellikle varsayılan olarak kurulmazlar. Ayrıca, çoklu iş parçacığının bzip2yalnızca sıkıştırma sırasında gerçekten bzip2işe yaradığını, ancak dosyanın LZMA2'ye zıt olarak tek bir dişli kullanarak sıkıştırılması durumunda, sıkıştırmanın tek bir diş kullandığını unutmayın. Paralel bzip2değişkenler, dosya bzip2genellikle paralel olmayan bir paralel sürüm kullanılarak sıkıştırıldığında yalnızca çok çekirdekli CPU'lardan yararlanabilir .


4
Peki bazı katranlar bir zseçenek grok .
tristrist

"hız" bir karışık cevap verir, sıkıştırma hızına veya dekompresyon hızına başvurmalısınız. Ne pixz, pbzip2 veya pigz, varsayılan olarak kurulmaz (veya -I bayrağı olmadan katran tarafından kullanılır), ancak pixz ve pbzip2 sıkıştırmayı hızlandırır ve sıkıştırmayı ve pigz sadece sıkıştırma içindir.
Tobu,

@Tobu xzvarsayılan olarak çok okuyuculu olacaktır, bu nedenle pixzileride kurulum gerekmez. Bazı platformlarda xziş parçacığı zaten desteklenmektedir. Halbuki bzip2, format akılda tutularak tasarlanmadığından, hiç okuyucunun çok az okunması muhtemel değildir. Ayrıca, pbzip2yalnızca dosya pbzip2genellikle kullanılmayan dosya kullanılarak sıkıştırıldığında sıkıştırmayı hızlandırır .
Marco

1
@Marco lbzip2'nin, paralel olmayan bir uygulama ile sıkıştırılmış olsalar bile dosyaların paralel olarak sıkıştırılmasına izin verdiğine inanıyorum (örneğin, stok bzip2). Bu yüzden pbzip2 yerine lbzip2 kullanıyorum. (Bu yorumunuzdan bu yana gelişti.)
RaveTheTadpole

19

Kısa cevap : xz, sıkıştırma oranı bakımından daha verimlidir. Böylece disk alanından tasarruf eder ve ağ üzerinden aktarımı optimize eder. Farkı pratik testlerle keşfetmek için
bu Hızlı Benchmark'ı görebilirsiniz .


Bağlantı koptu.
flarn2006

18

LZMA2 bir blok sıkıştırma sistemidir, oysa gzip değildir. Bu, LZMA2'nin çoklu iş parçacığına kendisini ödünç verdiği anlamına gelir. Ayrıca, bir arşivde bozulma meydana gelirse, genellikle LZMA2 ile sonraki bloklardaki verileri kurtarabilirsiniz, ancak bunu gzip ile yapamazsınız. Uygulamada, bozuk bloğu izleyen arşivin tamamını gzip ile kaybedersiniz. LZMA2 arşivi ile yalnızca bozuk bloklardan etkilenen dosyaları kaybedersiniz. Bu, birden fazla dosya içeren daha büyük arşivlerde önemli olabilir.


2
Bu gerçekten de çok faydalı ve önemli bir ayrım!
leden
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.