2009-04-09 12 views
12

मैं आकार में लगभग 4   KB में से प्रत्येक को टीसीपी पैकेट को संपीड़ित करने का प्रयास कर रहा हूं। पैकेट में कोई बाइट हो सकता है (0 से 255 तक)। मुझे मिली संपीड़न एल्गोरिदम पर सभी बेंचमार्क बड़ी फाइलों पर आधारित थे। मुझे कुछ भी नहीं मिला जो छोटी फ़ाइलों पर विभिन्न एल्गोरिदम के संपीड़न अनुपात की तुलना करता है, जो मुझे चाहिए। मुझे इसे ओपन सोर्स होने की ज़रूरत है ताकि इसे सी ++ पर कार्यान्वित किया जा सके, इसलिए उदाहरण के लिए कोई आरएआर नहीं है। आकार में लगभग 4 किलोबाइट की छोटी फ़ाइलों के लिए क्या एल्गोरिदम की सिफारिश की जा सकती है? LZMA? HACC? ZIP? gzip? bzip2?छोटे 4 केबी फाइलों के लिए सबसे अच्छा संपीड़न एल्गोरिदम क्या है?

+0

क्या ऐसा इसलिए है क्योंकि आप बैंडविड्थ उपयोग को अनुकूलित करना चाहते हैं? या यह एक प्रदर्शन मुद्दा है? यदि यह पूर्व है, तो सबसे अच्छी बात यह है कि वे सभी को आजमाएं और देखें कि वे कैसा दिखते हैं। यदि यह उत्तरार्द्ध है, तो आप पाएंगे कि पैकेट भेजने के रूप में संपीड़न-> send-> डिकंप्रेस दिनचर्या से तेज़ होगा। –

+0

ओजे: जरूरी नहीं ... कुछ वातावरण बेहद बैंडविड्थ सीमित हैं। अगर वह टीसीपी पैकेट को संपीड़ित करने के लिए भी चिंतित है, तो वह इस तरह के वातावरण में काम कर रहा है। –

+0

इसके अलावा, ऐसे कई कनेक्शन हैं जिनके पास बैंडविड्थ कुल उपयोग पर टोपी है, इसलिए पैकेट को संपीड़ित करने से उन्हें कुछ बैंडविड्थ सहेजने में मदद मिलेगी। –

उत्तर

13

एल्गोरिदम चुनें जो सबसे तेज़ है, क्योंकि आप शायद वास्तविक समय में ऐसा करने की परवाह करते हैं। आम तौर पर डेटा के छोटे ब्लॉक के लिए, एल्गोरिदम उसी के बारे में संपीड़ित होते हैं (कुछ बाइट्स देते हैं या लेते हैं) क्योंकि एल्गोरिदम को पेलोड के अतिरिक्त शब्दकोश या हफमैन पेड़ को प्रेषित करने की आवश्यकता होती है।

मैं अत्यधिक कारणों से Deflate (zlib और ज़िप द्वारा उपयोग किया जाता है) की अत्यधिक अनुशंसा करता हूं। एल्गोरिदम काफी तेज़, अच्छी तरह से परीक्षण किया गया है, बीएसडी लाइसेंस प्राप्त है, और ज़िप द्वारा समर्थित होने वाला एकमात्र संपीड़न है (इन्फोसिप एप्नोट के अनुसार)। मूलभूत बातों के अलावा, जब यह निर्धारित करता है कि संपीड़न डिकंप्रेस्ड आकार से बड़ा है, तो एक स्टोअर मोड है जो डेटा के प्रत्येक ब्लॉक के लिए केवल 5 बाइट जोड़ता है (अधिकतम ब्लॉक 64k बाइट्स है)। स्टोर मोड के अलावा, डिफ्लेट दो अलग-अलग प्रकार के हफमैन टेबल (या शब्दकोश) का समर्थन करता है: गतिशील और निश्चित। एक गतिशील तालिका का मतलब है कि हफमैन पेड़ संपीड़ित डेटा के हिस्से के रूप में प्रसारित होता है और यह सबसे लचीला (विभिन्न प्रकार के गैर-यादृच्छिक डेटा के लिए) होता है। एक निश्चित तालिका का लाभ यह है कि तालिका सभी डिकोडर्स द्वारा जानी जाती है और इस प्रकार संपीड़ित धारा में निहित होने की आवश्यकता नहीं होती है। डिकंप्रेशन (या इन्फ्लेट) कोड अपेक्षाकृत आसान है। मैंने ज़्लिब से सीधे जावा और जावास्क्रिप्ट संस्करण दोनों को लिखा है और वे बेहतर प्रदर्शन करते हैं।

अन्य संपीड़न एल्गोरिदम का उल्लेख उनकी योग्यता है। मैं संपीड़न चरण और विशेष रूप से डिकंप्रेशन चरण दोनों पर अपने रनटाइम प्रदर्शन की वजह से डिफ्लेट पसंद करता हूं।

स्पष्टीकरण का एक बिंदु: ज़िप एक संपीड़न प्रकार नहीं है, यह एक कंटेनर है। पैकेट संपीड़न करने के लिए, मैं ज़िप को बाईपास कर दूंगा और ज़्लिब द्वारा प्रदत्त डिफ्लेट/फुलाए गए एपीआई का उपयोग करूंगा।

2

उन सभी एल्गोरिदम प्रयास करने के लिए उचित हैं। जैसा कि आप कहते हैं, वे छोटी फ़ाइलों के लिए अनुकूलित नहीं हैं, लेकिन आपका अगला कदम बस उन्हें आज़माएं। कुछ सामान्य पैकेटों को टेस्ट-कंप्रेस करने के लिए इसमें केवल 10 मिनट लगेंगे और देखें कि आकार के परिणाम क्या हैं। (विभिन्न संपीड़न झंडे भी कोशिश करें)। परिणामी फाइलों से आप संभवतः चुन सकते हैं कि कौन सा टूल सबसे अच्छा काम करता है।

आपके द्वारा सूचीबद्ध उम्मीदवार सभी अच्छे प्रयास करते हैं। आप bzip2 भी कोशिश कर सकते हैं।

कभी-कभी सरल "उन सभी को आजमाएं" एक अच्छा समाधान है जब परीक्षण करना आसान होता है .. कभी-कभी सोचने से आपको धीमा कर दिया जाता है।

+1

मैं सहमत हूं, और पूछता हूं कि जब आप पूरा कर लेंगे तो आप अपने परिणाम पोस्ट करें :) – Blorgbeard

1

मुझे नहीं लगता कि फ़ाइल का आकार मायने रखता है - अगर मुझे सही याद है, तो जीआईएफ में एलजेडब्लूडब्ल्यू प्रत्येक 4K में अपना शब्दकोश रीसेट करता है।

1

ZLIB ठीक होना चाहिए। इसका उपयोग एमसीसीपी में किया जाता है।

हालांकि, अगर आपको वास्तव में अच्छा संपीड़न की आवश्यकता है, तो मैं सामान्य पैटर्न का विश्लेषण करता हूं और क्लाइंट में उनमें से एक शब्दकोश शामिल करता हूं, जो संपीड़न के उच्च स्तर भी पैदा कर सकता है।

-2

मैंने अरनो सेटागाया ने अपने उत्तर में सुझाव दिया: कुछ नमूना परीक्षण किए और परिणामों की तुलना की।

संपीड़न परीक्षण 5 फाइलों का उपयोग करके किया गया था, उनमें से प्रत्येक आकार में 4096 बाइट्स थे। इन 5 फाइलों के अंदर प्रत्येक बाइट यादृच्छिक रूप से उत्पन्न किया गया था।

महत्वपूर्ण: वास्तविक जीवन में, डेटा सभी यादृच्छिक नहीं होगा, लेकिन दोहराए जाने वाले बाइट्स को शांत करना होगा। इस प्रकार वास्तविक जीवन अनुप्रयोग में संपीड़न निम्नलिखित परिणामों के बाद थोड़ा बेहतर होगा।

नोट: 5 में से प्रत्येक फाइल स्वयं ही संपीड़ित की गई थी (यानी अन्य 4 फाइलों के साथ एक साथ नहीं, जिसके परिणामस्वरूप बेहतर संपीड़न होगा)। निम्नलिखित परिणामों में मैं सादगी के लिए 5 फाइलों के आकार के योग का उपयोग करता हूं।

मैंने तुलनात्मक कारणों के लिए केवल आरएआर शामिल किया, भले ही यह खुला स्रोत न हो।

परिणाम: (सबसे अच्छा से सबसे खराब करने के लिए)

LZOP: 20775/20480 * 100 = 101,44 मूल आकार

RAR का%: 20825/20480 मूल आकार के * 100 = 101.68%

LZMA: 20827/20480 * 100 = 101,69 मूल आकार का%

ज़िप: 21020/20480 * 100 = 102,64 मूल आकार का%

BZIP: 22899/20480 * 100 = 111।81% मूल आकार

निष्कर्ष: मेरे आश्चर्य के लिए सभी परीक्षण किए गए एल्गोरिदम ने बड़े आकार का मूल बना दिया !!! मुझे लगता है कि वे बड़ी फ़ाइलों को संपीड़ित करने के लिए केवल अच्छे हैं, या जिन फाइलों में दोहराए जाने वाले बाइट्स हैं (ऊपर की तरह यादृच्छिक डेटा नहीं)। इस प्रकार मैं अपने टीसीपी पैकेट पर किसी भी प्रकार का संपीड़न नहीं करूँगा। हो सकता है कि यह जानकारी उन लोगों के लिए उपयोगी होगी जो डेटा के छोटे टुकड़ों को संपीड़ित करने पर विचार करें।

संपादित करें: मैं यह उल्लेख करना भूल गया कि मैंने प्रत्येक एल्गोरिदम के लिए डिफ़ॉल्ट विकल्प (झंडे) का उपयोग किया था।

+7

आपका परीक्षण बहुत बेकार है। बस * किसी भी * संपीड़न एल्गोरिदम यादृच्छिक डेटा पर चकित होगा - असल में, संपीड़न अनुपात एक उपयोगी परीक्षण है * डेटा का एक हिस्सा कितना यादृच्छिक है - यदि "संपीड़न" डेटा बढ़ाता है, तो यह शायद उच्च-एन्ट्रॉपी है। वास्तविक डेटा के साथ पुनः प्रयास करें और आपको उपयोगी परिणाम मिल सकते हैं। – kquinn

+0

मैं मानता हूं कि परीक्षण बेकार है। यादृच्छिक रूप से वितरित डेटा संपीड़ित नहीं होगा, वास्तव में अधिकांश संपीड़न एल्गोरिदम का आधार यह है कि डेटा यादृच्छिक नहीं है। इसके अलावा, आपकी तुलना में zlib शामिल नहीं है जो प्रत्येक 64k में केवल 5 बाइट जोड़ता है जब STORE का उपयोग DEFLATE के बजाय किया जाता है। –

+1

संपीड़न जादू नहीं है। यह दोहराव पैटर्न देखकर काम करता है। यादृच्छिक डेटा में कोई दोहराव पैटर्न नहीं है, और इस प्रकार संकुचित नहीं होगा। यह 8^4096> 8^40 9 5 के रूप में नहीं हो सकता है। – derobert

1

मुझे ज़्लिब संपीड़न पुस्तकालयों का उपयोग करके भाग्य मिला है और किसी फ़ाइल कंटेनरों का उपयोग नहीं कर रहा है। ज़िप, आरएआर, फाइलनामों जैसी चीज़ों को स्टोर करने के लिए ओवरहेड है। मैंने संपीड़न को 200 बाइट्स तक पैकेट के लिए सकारात्मक परिणाम (मूल आकार से कम संपीड़न) उत्पन्न किया है।

0

आप delta compression आज़मा सकते हैं। संपीड़न आपके डेटा पर निर्भर करेगा। यदि आपके पास पेलोड पर कोई भी encapsulation है, तो आप हेडर को संपीड़ित कर सकते हैं।

5

यदि आप "टीसीपी पैकेट को संपीड़ित करना" चाहते हैं, तो आप आरएफसी मानक तकनीक का उपयोग करने पर विचार कर सकते हैं।

  • RFC1978 पीपीपी कारक संपीड़न प्रोटोकॉल
  • RFC2394 आईपी पेलोड संपीड़न का उपयोग
  • RFC2395 आईपी पेलोड संपीड़न का उपयोग LZS
  • DEFLATE
  • RFC3173 आईपी पेलोड संपीड़न प्रोटोकॉल (IPComp)
  • RFC3051 आईपी पेलोड संपीड़न ITU- का उपयोग करना टी वी44 पैकेट विधि
  • RFC5172 आईपीवी 6 आंकड़ारेख संपीड़न के लिए बातचीत आईपीवी 6 कंट्रोल प्रोटोकॉल
  • सिग्नलिंग संपीड़न के लिए
  • RFC5112 उपस्थिति विशिष्ट स्टेटिक शब्दकोश (Sigcomp)
  • RFC3284 VCDIFF जेनेरिक differencing और संपीड़न डाटा प्रारूप
  • RFC2118 माइक्रोसॉफ्ट प्वाइंट का उपयोग करना -टॉ पॉइंट संपीड़न (एमपीपीसी) प्रोटोकॉल

शायद अन्य प्रासंगिक आरएफसी मैंने अनदेखा कर दिया है।

1

आप bicom का परीक्षण कर सकते हैं। इस एल्गोरिदम को वाणिज्यिक उपयोग के लिए मना किया गया है। यदि आप इसे पेशेवर या वाणिज्यिक उपयोग के लिए चाहते हैं तो "रेंज कोडिंग एल्गोरिदम" देखें।

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