Fark: LZ77 ve LZ4 vs. LZ4HC (sıkıştırma algoritmaları)?

LZ77 ve LZ78 algoritmalarını anlıyorum. Burada ve burada LZ4'ü okudum ve kodunu buldum.

Bu bağlantılar LZ4 bloğunun formatını tanımlar. Ancak eğer biri açıklayabilir (veya bazı kaynakları açıklamamı yönlendirebilirse) çok iyi olurdu:

  • LZ4'ün LZ77'den farkı nedir?
  • LZ4HC'nin LZ4'ten farkı nedir?
  • LZ4HC algoritması bu kadar hızlı ne yapar?
18
20 февр. ghost204nit 20 Şubat tarihinde ayarlandı . 2015-02-20 21:09 '15 21:09 2015-02-20 21:09
ответ 1 cevap

LZ4 hızlı sıkıştırma için üretilmiştir, örneğin çekirdek başına 400 MB / sn'den fazla. Bu, sıkıştırmanın çok ucuz olmasını istediğiniz uygulamalar için uygundur: örneğin, bir ağ üzerinde veya bir diskte daha kompakt bir CD yapmaya çalışıyorsunuz, ancak sıkıştırma için çok fazla zaman harcayamıyorsunuz. Snappy ve LZO gibi bir ailenin içindedir. Bu algoritmalar popüler DEFLATE'ten farklı çünkü:

  • Daha hızlı olan (genellikle çarpışma algılaması olmayan basit bir karma tablo ) tekrarlayan algılama kodunu kullanırlar, ancak en iyisi için olası tüm eşleşmeleri aramaz (bu zaman alır, ancak daha yüksek sıkıştırma sağlar) ve kısa eşleşmeler bulamaz.
  • Yalnızca girdideki tekrarları sıkıştırmaya çalışıyorlar - bazı baytları diğerlerinden daha yaygın olarak kullanmaya çalışmıyorlar.
  • 2 ile yakından ilişkili olarak, bir defada bit değil, çıktı bayt üretir; bayt cinsinden kesirli kodlara izin vermek bazen daha fazla sıkıştırma yapılmasına izin verir, ancak kodlama ve kod çözme için daha fazla CPU işlemi gerekir (potansiyel olarak biraz kaydırma ve maskeleme ve dallanma).
  • Pratik çalışmaların çoğu, modern işlemciler üzerindeki hızlı uygulamalarına adanmıştır.

Karşılaştırma için, DEFLATE daha iyi sıkıştırma elde eder, ancak sıkıştırır ve daha yavaş sıkıştırır ve LZMA , bzip2 , LZHAM veya brotli gibi yüksek sıkıştırma algoritmaları daha uzun sürebilir (her ne kadar daha hızlı ayarlara sahip olan Brotli zlib ile rekabet edebilirse de ). Yüksek sıkıştırma algoritmaları arasında birçok farklılıklar vardır, ancak genel olarak uzun mesafelerde fazlalık yakalama eğilimindedirler, hangi baytların muhtemel olduğunu belirlemek için daha fazla bağlam avantajı kullanırlar ve sonuçlarını daha küçük fakat daha yavaş, bitlerde ifade etmenin yollarını kullanırlar.

LZ4HC, yukarıdaki 1 numaralı noktayı değiştiren LZ4'ün yüksek sıkıştırma sürümüdür - kompresör tüm tekrarları bulmaya çalışır ve küçük bir çıkış sinyali sağlamak için “en iyisini” seçer. Bu sıkıştırma oranını arttırır, ancak LZ4 ile karşılaştırıldığında sıkıştırma oranını azaltır. Dekompresyon hızı bozulmamıştır, bu nedenle bir kez sıkar ve birçok kez açarsanız ve temelde çok ucuz dekompresyon yapmak istiyorsanız, LZ4HC mantıklı olur.

Hızlı bir kompresörün bile, bir merkezin SSD veya veri merkezindeki hızlı kanallar tarafından sağlanan daha fazla bant genişliğini doyurmasına izin vermeyebileceğini unutmayın. Bazen verileri RAM'e geçici olarak paketlemek için kullanılan, daha düşük katsayılı daha hızlı kompresörler bile vardır. WKdm ve Yoğunluk bu tür iki kompresördür ve bazen özel ekipmanlar örneğin Samsung Exynos yongaları veya Intel QuickAssist teknolojisi gibi çok hızlı bir sıkıştırma sağlayabilir.

LZ4'ten daha fazla sıkıştırmakla ilgileniyorsanız, ancak iniş işleminden daha az CPU süresi olan LZ4'ün (Yann Collet) yazarı Zstd adlı bir kütüphane yazdı; Kararlı sürümünde, Facebook nasıl kullandıkları hakkında bilgiler yayınladı . Entropi kodlaması için sonlu otomatları kullanır, Huffman kodlarını değil; Ayrıntılar hakkında daha fazla şey söylemek istiyorum, ama önce onları öğrenmek için okumak zorunda kaldım. Apple aynı prensiplere lzfse yazdı. Birkaç yıl önce Google, çok fazla ilgi çekmemiş gibi görünse de, gipfeli adlı bir kütüphane yayınladı. Zlib formatında sıkıştırmayı hızlandırmayı hedefleyen projeler de var; örneğin SLZ ve CloudFlare ve Intel'den zlib .

En hızlı kompresörlerle karşılaştırıldığında, bu "ortalama" paketleyiciler bir tür entropi kodlaması ekler, yani bazı baytların diğerlerinden daha yaygın olmasından faydalanırlar ve (aslında) daha genel bayt değerleri için sonuçta daha az bit koyarlar.

Sorununuz gecikmeyle ilişkiliyse, toplam işlemci süresi değil ve bir uzun iş parçacığını sıkıştırıyorsanız, pigz ve pzstd gibi paralel sıkıştırma araçları vardır. (Orada da çeşitli deneysel paketleyiciler var, ancak sınırları günümüzde kullanılmak üzere değil hız veya yoğunlukta zorlamak için varlar.)

Bu nedenle, farklı uygulamalar için oldukça iyi bir alternatif kompresör yelpazesine sahipsiniz: gerçek zamanlı sıkıştırma için LZ4 (veya daha zayıf bellek kompresörleri), dengeli sıkıştırma için eski standart olarak DEFLATE ve yeni alternatifler olarak Zstd ve lzfse ve brotli ve diğerleri yüksek sıkıştırma için. LZ4'ten DEFLATE'ten dolaşıma geçtiğinizde, verileri tahmin etme ve kodlama ve bazı hızlardan dolayı daha fazla sıkıştırma elde etmek için daha fazla çaba harcarsınız.

42
20 февр. Cevap 20 şubatta verilir. 2015-02-20 21:35 '15 21:35 2015-02-20 21:35