2015-02-20 3 views
18

मैं एलजेड 77 और एलजेड 78 एल्गोरिदम को समझता हूं। मैंने एलजेड 4 here और here के बारे में पढ़ा और code for it पाया।अंतर: एलजेड77 बनाम एलजेड 4 बनाम एलजेड 4 एचसी (संपीड़न एल्गोरिदम)?

उन लिंकों ने एलजेड 4 ब्लॉक प्रारूप का वर्णन किया। लेकिन यह बहुत अच्छा होगा अगर कोई मुझे समझा सकता है (या मुझे कुछ संसाधन समझा सकता है):

  • एलजेड 4 से एलजेड 4 अलग कैसे है?
  • LZ4HC LZ4 से अलग कैसे है?
  • क्या विचार LZ4HC एल्गोरिदम इतना तेज़ बनाता है?
+0

आपके पास कई प्रश्न हैं जो सभी एक साथ उलझ गए हैं। उन सभी को कवर करने के लिए 10 पेज का उत्तर लिखना होगा। – swdev

+0

@swdev (यद्यपि आप जो कहते हैं वह सच है, मैंने बड़े पुराने उत्तर को लिखने पर एक शॉट दिया :) :) – twotwotwo

उत्तर

43

LZ4 प्रति कोर 400 एमबी/एस की तरह तेजी से संपीड़ित करने के लिए बनाया गया है। यह उन अनुप्रयोगों के लिए उपयुक्त है जहां आप संपीड़न चाहते हैं जो बहुत सस्ता है: उदाहरण के लिए, आप नेटवर्क या ऑन-डिस्क प्रारूप को अधिक कॉम्पैक्ट बनाने की कोशिश कर रहे हैं लेकिन संपीड़न पर CPU समय का एक गुच्छा खर्च करने का जोखिम नहीं उठा सकते हैं। यह एक परिवार में है, उदाहरण के लिए, snappy और LZO। इन एल्गोरिदम लोकप्रिय DEFLATE से अलग है क्योंकि:

  1. वे पुनरावृत्ति का पता लगाने कोड तेजी से (अक्सर एक सरल hashtable कोई टक्कर पता लगाने के साथ) है, लेकिन सबसे अच्छा एक के लिए सभी संभव मैचों के माध्यम से खोज नहीं करता है (जो ले जाएगा कि का उपयोग समय लेकिन उच्च संपीड़न में परिणाम), और कुछ छोटे मैच नहीं मिल सकते हैं।
  2. वे केवल इनपुट में पुनरावृत्ति को संपीड़ित करने का प्रयास करते हैं - वे कुछ बाइट्स का लाभ दूसरों के मुकाबले अधिक आम होने का प्रयास नहीं करते हैं।
  3. निकटता से 2 से संबंधित, वे एक समय में उत्पादन के बाइट उत्पन्न करते हैं, बिट्स नहीं; अंश-ऑफ-ए-बाइट कोड को कभी-कभी अधिक संपीड़न की अनुमति मिलती है, लेकिन एन्कोड और डीकोड करने के लिए अधिक CPU ऑपरेशन (संभावित रूप से बिट-स्थानांतरण और मास्किंग और ब्रांचिंग) की आवश्यकता होती है।
  4. व्यावहारिक कार्य आधुनिक CPUs पर अपने कार्यान्वयन को तेजी से करने में चला गया है।

तुलना करके, हवा निकालना बेहतर संपीड़न हो जाता है लेकिन संपीड़ित करता है और धीमी decompresses, और जैसे LZMA, bzip2, LZHAM, या brotli भी अधिक समय लेने के लिए (हालांकि Brotli at its faster settings can compete with zlib) करते हैं उच्च संपीड़न एल्गोरिदम। उच्च संपीड़न एल्गोरिदम के बीच बहुत भिन्नता है, लेकिन मोटे तौर पर, वे लंबी दूरी पर अनावश्यकता को पकड़ते हैं, यह निर्धारित करने के लिए संदर्भ का अधिक लाभ लेते हैं कि बाइट्स की संभावना क्या है, और बिट्स में अपने परिणामों को व्यक्त करने के लिए अधिक कॉम्पैक्ट लेकिन धीमे तरीकों का उपयोग करें।

एलजेड 4 एचसी एलजेड 4 का एक "उच्च संपीड़न" संस्करण है, जो मेरा मानना ​​है कि उपरोक्त बिंदु 1 को बदलता है - कंप्रेसर सभी पुनरावृत्ति खोजने की कोशिश करता है और आउटपुट छोटा होने के लिए "सर्वश्रेष्ठ" का चयन करता है। यह संपीड़न अनुपात में सुधार करता है लेकिन एलजेड 4 की तुलना में संपीड़न गति कम करता है। डिकंप्रेशन गति को चोट नहीं पहुंची है, हालांकि, यदि आप एक बार संपीड़ित करते हैं और कई बार डिकंप्रेस करते हैं और अधिकांशतः सस्ते डिकंप्रेशन चाहते हैं, तो एलजेड 4 एचसी समझ में आ जाएगा।

ध्यान दें कि एक तेज़ कंप्रेसर भी एक कोर को बड़ी मात्रा में बैंडविड्थ को संतृप्त करने की अनुमति नहीं दे सकता है, जैसे एसएसडी या फास्ट इन-डेटासेंटर लिंक द्वारा प्रदान किया गया। कम अनुपात वाले तेज कंप्रेसर भी होते हैं, कभी-कभी temporarily pack data in RAM पर उपयोग किए जाते हैं। WKdm और Density दो ऐसे कंप्रेसर हैं, और कभी-कभी विशेष हार्डवेयर Samsung's Exynos chips या Intel's QuickAssist technology जैसे बहुत तेज संपीड़न प्राप्त कर सकते हैं।

यदि आप एलजेड 4 से अधिक संपीड़ित करने में रुचि रखते हैं लेकिन डिफ्लेट से कम CPU समय के साथ, एलजेड 4 (यान कोलेट) के लेखक ने Zstd नामक लाइब्रेरी लिखी है; इसकी स्थिर रिलीज पर, Facebook posted about how they use it। यह finite state machines का उपयोग करता है, हफ़मैन कोड नहीं, एन्ट्रॉपी कोडिंग के लिए; काश मैं विवरण के बारे में और कह सकता हूं लेकिन पहले मुझे उनके बारे में जानने के लिए पढ़ना होगा। ऐप्पल ने उसी सिद्धांत पर lzfse लिखा था। कुछ साल पहले, Google ने gipfeli नामक एक लाइब्रेरी प्रकाशित की, हालांकि ऐसा लगता है कि यह अधिक कर्षण नहीं ले रहा था। Zlib प्रारूप में तेजी से संपीड़न के उद्देश्य से परियोजनाएं भी हैं, जैसे SLZ और patches to zlib by CloudFlare and Intel

सबसे तेजी से कम्प्रेसर की तुलना में, उन "मध्यम" पैकर एन्ट्रापी एन्कोडिंग, जो वे कैसे कुछ बाइट्स दूसरों की तुलना में अधिक आम हैं का लाभ उठाने और (प्रभाव में) में कम बिट्स डाल कहना है विधि जोड़ने अधिक सामान्य बाइट मूल्यों के लिए उत्पादन।

यदि कुल CPU समय की बजाय विलंबता आपकी मुख्य चिंता है और आप एक लंबी स्ट्रीम को संपीड़ित कर रहे हैं, तो समानांतर में संपीड़न करने के लिए उपकरण हैं, जैसे pigz और pzstd। (वहाँ various प्रयोगात्मक packers वहाँ भी हैं, लेकिन वे और अधिक मौजूद गति या घनत्व पर सीमाओं को पुश करने के बजाय, उपयोग के लिए आज की तुलना में।)

तो, सामान्य रूप में, आप विभिन्न क्षुधा के लिए विकल्प कम्प्रेसर की एक बहुत अच्छा स्पेक्ट्रम है : रीयलटाइम संपीड़न के लिए एलजेड 4 (या यहां तक ​​कि कमजोर मेमोरी कंप्रेसर), संतुलित संपीड़न के लिए पुराने मानक के रूप में डिफलेट और जेडडीडी और एलजीएफएस नए विकल्प के रूप में, और ब्रोटली और अन्य उच्च संपीड़न के लिए। जैसे ही आप LZ4 से DEFLATE तक ब्रोटली तक जाते हैं, आप डेटा की भविष्यवाणी और एन्कोड करने के लिए अधिक प्रयास करते हैं और कुछ गति की लागत पर अधिक संपीड़न प्राप्त करते हैं।

+0

एक और पृष्ठ कृपया, आप एलजेड 77 का वर्णन करना भूल गए हैं और यह कैसे भिन्न है :-) – swdev

+0

@twotwotwo महान लेखन। मुझे पता है कि यह दायरे से बाहर हो सकता है, लेकिन https://github.com/pieroxy/lz-string के बारे में क्या? क्या आपको लगता है कि यह एल्गोरिदम LZ4 से तेज है? –

+3

@NiCkNewman - यह जेएस वर्चुअल मशीन में चलाने के लिए बाध्य है, जबकि एलजेड 4 अनुकूलित सी या असेंबली का उपयोग कर सकते हैं। जावास्क्रिप्ट इंजन वे जो करते हैं उस पर आश्चर्यजनक होते हैं, लेकिन फिर भी ट्यून किए गए देशी कोड की तरह नहीं हैं। यह शायद धीमा है। हालांकि, यह हमेशा आपके विशेष काम के लिए सही उपकरण हो सकता है। – twotwotwo

संबंधित मुद्दे