2014-09-09 6 views
7

decompressed और जबLZ4 पुस्तकालय मैं <a href="https://code.google.com/p/lz4/" rel="noreferrer">LZ4</a> पुस्तकालय का उपयोग कर रहा डेटा ऊपरी बाध्य आकार आकलन

int LZ4_decompress_safe (const char* source, char* dest, int compressedSize, int maxDecompressedSize); 

साथ डेटा decompressing मैं अधिकतम decompressed डेटा आकार का अनुमान लगाना चाहते हैं। लेकिन मैं

int LZ4_compressBound(int isize); 

के विपरीत समारोह जिसके साथ मैं decompressed डेटा है, जो समारोह decompressing के अंतिम पैरामीटर maxDecompressedSize को प्रदान करने के लिए, के लिए ऊपरी सीमा निर्धारित कर सकते हैं नहीं मिल रहा।

उदाहरण के लिए snappy जैसे अन्य संपीड़न पुस्तकालय ऐसे कार्य प्रदान करते हैं।

bool GetUncompressedLength(Source* source, uint32* result); 

मैं अगर मैं आरंभिक डेटा का आकार (संपीड़न से पहले) को बचाने के लिए क्षमता नहीं है क्या कर सकते हैं, और मैं बफर जो मैं आवंटित करना चाहिए के आकार के लिए निराशावादी से अधिक होने का नहीं करना चाहते हैं?

उत्तर

6

एलजेड 4 का अधिकतम संपीड़न अनुपात 255 है, इसलिए डिकंप्रेस्ड डेटा आकार की गारंटीकृत ओवर-अनुमान 255 गुना इनपुट आकार है।

यह वास्तव में बहुत उपयोगी होने के लिए बहुत अधिक है, इसलिए इसका कारण है कि कोई "रिवर्स LZ4_compressBound()" फ़ंक्शन उपलब्ध नहीं है।

मुझे डर है कि असम्पीडित आकार को बचाने या जानने के अलावा कोई अन्य तरीका नहीं है। एलजेड 4 "कच्चा" संपीड़न प्रारूप ऐसी जानकारी को सहेजने के लिए एक तरीका परिभाषित नहीं करता है, क्योंकि इष्टतम विकल्प एप्लिकेशन विशिष्ट है। उदाहरण के लिए, कुछ एप्लिकेशन पहले से जानते हैं कि कोई ब्लॉक> 16 केबी नहीं हो सकता है, इसलिए वे LZ4_decompress_safe() को कॉल करते समय maxDecompressedSize = 16 KB का उपयोग कर सकते हैं।

अब, आप देख रहे हैं एक लिफाफा प्रारूप है कि प्रभारी ऐसी जिम्मेदारी में ले जाएगा के लिए, आप या तो एक बना सकते हैं अपने स्वयं के कस्टम, या LZ4 फ्रेमिंग प्रारूप का उपयोग करें: (स्रोत पैकेज में LZ4_Framing_Format.html के रूप में भी अब तक) http://fastcompression.blogspot.fr/2013/04/lz4-streaming-format-final.html । अफसोस, पुस्तकालय पैदा करते हैं और इस प्रारूप को पढ़ने में सक्षम बीटा चरण में है (https://github.com/Cyan4973/lz4/tree/frame)

6
बस संदर्भ के लिए

, LZ4 की n बाइट्स संकुचित डेटा प्रतिनिधित्व कर सकते हैं अप करने के लिए 24 + 255 (n - 10) असम्पीडित बाइट्स, जो कि कई बाइट्स के दौड़ का मामला है। एन एक वैध धारा बनाने के लिए कम से कम दस होना चाहिए जिसमें एक शाब्दिक, एक मैच, और उसके बाद विनिर्देश के अंत में पांच अक्षर शामिल हों। तो डिकंप्रेस बाध्य फ़ंक्शन (n << 8) - n - 2526 जैसा कुछ हो सकता है।

अधिकतम संपीड़न अनुपात तो है: 255 - 2526/n, जो asymptotically के लिए मनमाने ढंग से बड़े n 255 दृष्टिकोण।

+0

मैंने इस पोस्ट में स्पष्ट रूप से सटीक सीमाओं की गणना करने के लिए समय नहीं लिया है। सरल सूत्रों के लिए धन्यवाद! – Cyan

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