2010-12-03 18 views
6

आइए कहें कि मेरे पास कई ऑब्जेक्ट्स हैं जिनमें गैर-तुच्छ लंबाई (लगभग ~ 3-4 केबी) की तार शामिल हैं। स्ट्रिंग्स एक-दूसरे से अलग हैं, फिर भी एक ही समय में बहुत सारे सामान्य भाग/बाद के होते हैं। औसतन किसी भी व्यक्तिगत स्ट्रिंग का 80-90% दूसरों के साथ भी निहित होता है। डेटा को संपीड़ित करने के लिए इस विशाल अनावश्यकता का स्वचालित रूप से उपयोग करने का कोई आसान तरीका है?
आदर्श रूप से समाधान सी ++ होगा और उपयोगकर्ता के लिए पारदर्शी होगा (यानी मैं इसका उपयोग कर सकता हूं जैसे कि मैं नियमित रूप से पढ़ने के लिए केवल std :: स्ट्रिंग का उपयोग कर रहा था लेकिन संकुचित स्टोरेज से पढ़ने के बजाय)।संकुचित स्ट्रिंग स्टोरेज

+0

स्ट्रिंग्स में सामान्य सब-अनुक्रम कैसे होते हैं। क्या यह डेटा के दोहराए गए संपादन या संयोग के कारण है? – SingleNegationElimination

+0

सीएसएस के समर्थन के बिना स्थिर एचटीएमएल की कल्पना करो। आपके पास बहुत सी अनावश्यक एचटीएमएल है और वास्तविक जानकारी वाले बहुत ही कम बदलते हिस्सों हैं। – BuschnicK

+0

1 जीबी रैम 100,000 असंपीड़ित ब्लब्स के आकार 3-4 केबी के क्रम में होगा। क्या आपको वास्तव में कम फिट करने की ज़रूरत है? – SingleNegationElimination

उत्तर

3

एल्गोरिदमिक रूप से, Lempel–Ziv–Welch सभी वस्तुओं/तारों के लिए एक शब्दकोश के साथ एक अच्छी शुरुआत हो सकती है।

+0

यदि समय के साथ बहुत से तार गतिशील रूप से बनाए जाते हैं, तो यह शब्दकोश बड़ा हो जाएगा। तो अंत में, यह केवल एक आसान और बेहतर विचार हो सकता है कि केवल LZW तारों को अलग से संपीड़ित करें। –

+0

आरंभिक बैच लोड होने के बाद बहुत कम स्ट्रिंग बनाए जाएंगे, इसलिए मुझे वहां कोई समस्या की उम्मीद नहीं होगी ... – BuschnicK

2

तार के आम भागों आम कर रहे हैं, क्योंकि वे दूसरे तार से बना रहे हैं, तो आप कुछ कर्षण stlportrope वर्ग है, जो एक std :: स्ट्रिंग की तरह पूरी दुनिया के लिए लग रहा है का उपयोग करके प्राप्त कर सकता है, लेकिन स्ट्रिंग का उपयोग करता है लिखने पर प्रति के साथ पेड़ प्रतिनिधित्व कि उन दोनों को बहुत अंतरिक्ष कुशल (आम सबस्ट्रिंग साझा कर रहे हैं) और आवेषण और नष्टकरण (लॉग (एन)) में बहुत अच्छा बना देता है

रस्सी उपयोग कब करें:

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

रस्सी का उपयोग करने के लिए नहीं है:

  • आप अपने आवेदन (डिस्क से, या एक नेटवर्क पर) के डोमेन से बाहर के कई दस्तावेज लोड हो रहा है और संशोधन के बिना उन्हें प्रयोग कर रहे हैं। रस्सी तारों को साझा नहीं करती है अगर उन्हें एक रस्सी से दूसरे में कॉपी नहीं किया जाता है। यदि आप आम सबस्ट्रिंग्स को खोजने के लिए काम करने के लिए सक्षम हो सकते हैं, तो रस्सी का उपयोग अभी भी आपके अंतिम प्रतिनिधित्व में सुधार के लिए किया जा सकता है।
+0

मुझे लगता है कि यह लिखने पर प्रतिलिपि से अधिक है। मुझे लगता है कि डेटा स्ट्रिंग के पेड़ में संग्रहीत है, न कि एक संगत स्मृति क्षेत्र में। –

+0

यह कॉपी-ऑन-राइट संयुक्त है जो उसी एल्गोरिदमिक लागत पर तारों को प्रीपेड करने की क्षमता के साथ जोड़ता है। –

+0

मुझे लगता है कि मैं आपके दूसरे मामले में फिट हूं: मेरे तार मेरे द्वारा नियंत्रित नहीं हैं और मैं उन्हें डेटाबेस से प्राप्त करता हूं। – BuschnicK

3

आप huffman coding कार्यान्वयन का उपयोग नहीं कर सकते हैं, इसके अलावा भाषाओं में ज़िप एल्गोरिदम भी हैं (जैसे सी # और जावा) और आप उनका उपयोग कर सकते हैं।

यदि आप सुनिश्चित करते हैं कि 80-90% सभी में दोहराया गया है, तो सभी शब्दों का एक शब्दकोश बनाएं, फिर प्रत्येक स्ट्रिंग को शब्दकोष शब्द की स्थिति संग्रहित करने के लिए, इसका मतलब बड़े आकार (10000 यानी) का थोड़ा सरणी है और चिह्नित करें संबंधित स्थिति bits[i] से 1 यदि वर्तमान स्ट्रिंग में words[i] मौजूद है। लगता है कि प्रत्येक शब्द की लंबाई 5 वर्ण है तो संक्षिप्त नाम 1/5 आकार लेता है।

1

जैसा कि @ सईद ने उल्लेख किया है, एक सरल हफमैन कोडिंग यहां अच्छा प्रदर्शन करेगा।

शब्दकोश में कोई आवश्यकता नहीं है, यदि आम शब्द apriori (आपने उल्लेख किया है कि यह एक HTML है) है। बस कई HTML फ़ाइलों से सांख्यिकीय डेटा का उपयोग करके एक हफमैन तालिका का प्रीकंप्यूट करें (ध्यान दें कि आप एक ही प्रतीक से पूरे टैग को एन्कोड कर सकते हैं, और आपके पास जितने चाहें उतने प्रतीक हो सकते हैं)।

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