2008-11-10 9 views
8

मैं एक संकुचित प्रारूप में निम्नलिखित tuples की एक सूची संग्रहीत करना चाहते हैं और मैं सोच रहा था जो एल्गोरिथ्म मुझेसर्वश्रेष्ठ संपीड़न एल्गोरिदम? (सबसे अच्छा की परिभाषा के लिए नीचे देखें)

  • छोटी से छोटी संकुचित आकार देता है
  • सबसे तेजी से डी/संपीड़न
  • दुविधा यह इष्टतम (दुविधा यह वक्र के "घुटने")

मेरे डेटा इस तरह दिखता है:

(<int>, <int>, <double>), 
(<int>, <int>, <double>), 
... 
(<int>, <int>, <double>) 

दो चींटियों में से एक समय में एक बिंदु को संदर्भित करता है और यह बहुत संभावना है कि एक सूची में समाप्त होने वाली संख्याएं एक दूसरे के करीब हैं। दूसरा int एक अमूर्त आईडी का प्रतिनिधित्व करता है और मान करीब होने की संभावना कम होती है, हालांकि वे पूरी तरह से यादृच्छिक नहीं होने जा रहे हैं। डबल एक सेंसर पढ़ने का प्रतिनिधित्व कर रहा है और मूल्यों के बीच कुछ सहसंबंध है, लेकिन शायद यह अधिक उपयोग नहीं है।

उत्तर

4

चूंकि "समय" स्याही एक-दूसरे के करीब हो सकते हैं, केवल पहले स्टोर करने का प्रयास करें और उसके बाद अंतर को पहले (डेल्टा-कोडिंग) में सहेजें। आप दूसरी int के लिए भी कोशिश कर सकते हैं।

एक और चीज जो आप कोशिश कर सकते हैं वह है [int1, int2, double], [int1, int2, double] ... [int1, int1 ...], [int2, int2 ... से डेटा को पुनर्गठित करना है ... ], [दुगुना दुगुना...]।

संपीड़न सीमा का पता लगाने के लिए आपका परिणाम होगा, आप अपना डेटा फ़ाइल में लिख सकते हैं और क्रिश्चियन मार्टेलॉक here से कंप्रेसर सीसीएम डाउनलोड कर सकते हैं। मुझे पता चला कि यह इस तरह के डेटा संग्रह के लिए बहुत अच्छा प्रदर्शन करता है। यह बहुत तेजी से context mixing एल्गोरिदम का उपयोग करता है। आप इसे WinZIP जैसे अन्य कंप्रेशर्स से भी तुलना कर सकते हैं या एक संपीड़न लाइब्रेरी का उपयोग कर सकते हैं जैसे zLib यह देखने के लिए कि यह प्रयास के लायक है या नहीं।

2

यदि मैं सही प्रश्न पढ़ रहा हूं, तो आप बस डेटा को कुशलता से स्टोर करना चाहते हैं। स्पष्ट रूप से संपीड़ित एक्सएमएल जैसे सरल विकल्प सरल हैं, लेकिन अधिक प्रत्यक्ष बाइनरी क्रमिकरण विधियां हैं। दिमाग में लापरवाही Google की protocol buffers है।

उदाहरण के लिए, सी # protobuf-net साथ में, आप बस एक वर्ग धारण करने के लिए डेटा बना सकते हैं:

[ProtoContract] 
public class Foo { 
    [ProtoMember(1)] 
    public int Value1 {get;set;} 
    [ProtoMember(2)] 
    public int Value2 {get;set;} 
    [ProtoMember(3)] 
    public double Value3 {get;set;} 
} 
सिर्फ

फिर [de] एक सूची या फू [] आदि, के माध्यम से ProtoBuf.Serializer वर्ग को क्रमानुसार ।

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

इस दृष्टिकोण के साथ-साथ कार्यान्वित करने के लिए सरल होने के साथ-साथ अन्य आर्किटेक्चर से उपयोग करने के लिए सरल होने का लाभ भी है, क्योंकि various languages के लिए प्रोटोकॉल बफर कार्यान्वयन हैं। यह नियमित [डी] संपीड़न (जीजेआईपी/डेफलेट/आदि), और/या एक्सएमएल-आधारित क्रमिकरण से बहुत कम CPU का भी उपयोग करता है।

+0

यह इंगित करने के लिए धन्यवाद कि मैं पीबी के साथ सामान को क्रमबद्ध कर रहा हूं, इसलिए यह मेरे संदर्भ में एक प्राकृतिक विकल्प है। क्या आप जानते हैं कि क्या वे छोटे अनुक्रमों के साथ दोहराए गए पैटर्न को संपीड़ित करते हैं? मैं आरटीएफ स्पेक भी कर सकता हूं, अगर नहीं। ;-) –

+0

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

+0

ठीक है, तो इसका मतलब है कि 3-टुपल्स की एक सूची के बजाय प्रत्येक टुपल सदस्य के लिए तीन क्रमबद्ध सूचियां प्राप्त करने के लिए डेटा को पुन: व्यवस्थित करना मुझे कुछ भी नहीं खरीदेंगे? –

2

अधिकांश संपीड़न एल्गोरिदम ऐसे डेटा पर समान रूप से खराब काम करेंगे। हालांकि, कुछ चीजें हैं ("प्रीप्रोकैसिंग") जो आप डेटा की संपीड़न को किसी gzip को खिलाने से पहले या एल्गोरिदम की तरह डिफ्लेट करने से पहले कर सकते हैं।निम्न का प्रयास करें:

सबसे पहले, यदि संभव हो, तो टुपल्स को आरोही क्रम में क्रमबद्ध करें। पहले अमूर्त आईडी का उपयोग करें, फिर टाइमस्टैम्प। मान लें कि आपके पास एक ही सेंसर से कई रीडिंग हैं, इसी तरह के आईडी एक साथ बंद रखे जाएंगे।

अगला, यदि नियमित अंतराल पर उपाय किए जाते हैं, तो टाइमस्टैम्प को पिछले टाइमस्टैंप से अंतर के साथ प्रतिस्थापित करें (निश्चित रूप से सेंसर के लिए पहले ट्यूपल को छोड़कर)। उदाहरण के लिए, यदि सभी उपाय 5 पर लिया जाता है मिनट अंतराल, दो टाइमस्टैम्प के बीच डेल्टा आमतौर पर 300 सेकंड के करीब होगा। इसलिए टाइमस्टैम्प फ़ील्ड अधिक संकुचित हो जाएगा, क्योंकि अधिकांश मान बराबर हैं।

फिर, यह मानते हुए कि मापा मान समय पर स्थिर हैं, एक ही सेंसर के लिए पिछले पढ़ने से डेल्टा के साथ सभी रीडिंग को प्रतिस्थापित करें। दोबारा, अधिकांश मान शून्य के करीब होंगे, और इस प्रकार अधिक संपीड़ित होंगे।

इसके अलावा, फ़्लोटिंग पॉइंट वैल्यू उनके आंतरिक प्रतिनिधित्व के कारण संपीड़न के लिए बहुत बुरे उम्मीदवार हैं। उन्हें एक पूर्णांक में बदलने की कोशिश करें। उदाहरण के लिए, तापमान रीडिंग को अधिकतर दो दशमलव अंकों की आवश्यकता नहीं होती है। मूल्यों को 100 से गुणा करें और निकटतम पूर्णांक तक गोल करें।

2

यहां अधिकांश खोज इंजनों में उपयोग की जाने वाली एक आम योजना है: मूल्यों को स्टोर करें और एक परिवर्तनीय बाइट एन्कोडिंग योजना का उपयोग करके डेल्टा को एन्कोड करें, यानी यदि डेल्टा 128 से कम है, तो इसे केवल 1 बाइट के साथ एन्कोड किया जा सकता है। विवरण के लिए लुसीन और प्रोटोकॉल बफर में विंट देखें।

यह आपको सबसे अच्छा संपीड़न अनुपात नहीं देगा लेकिन आमतौर पर एन्कोडिंग/डिकोडिंग थ्रूपुट के लिए सबसे तेज़ होगा।

2

क्रमबद्ध रूप में पहले से ही प्रस्तावित है, तो

(प्रथम ints) (दूसरा ints) (डबल्स)

स्थानांतरित मैट्रिक्स की दुकान। तब

0

महान जवाब संकुचित, रिकार्ड के लिए, मैं मैं अंत में उपयोग कर रहा हूँ उन मैं दृष्टिकोण में upvoted विलय करने के लिए जा रहा हूँ:

  1. क्रमबद्ध और डेटा पुनर्निर्माण ताकि समान संख्या के बगल में हैं एक दूसरे, मैं। ई। आईडी के आधार पर चुनना पहले, तो टाइमस्टैम्प द्वारा और (<int1>, <int2>, <double>), ... से ([<int1>, <int1> ...], [<int2>, <int2> ... ], [<double>, <double> ...]) को पुन: व्यवस्थित करने (के रूप में (और शायद अन्य मूल्यों के टाइमस्टैम्प पर schnaader और Stephan Leclercq

  2. उपयोग डेल्टा एन्कोडिंग ने सुझाव दिया) के रूप में schnaader और ididak

  3. ने सुझाव दिया
  4. उपयोग प्रोटोकॉल बफ़र्स क्रमानुसार करने (मैं उन्हें आवेदन में वैसे भी उपयोग करने के लिए जा रहा हूँ, ताकि निर्भरता या कुछ भी जोड़ने की नहीं हो रहा है) मुझे इसे की ओर इशारा करते के लिए Marc Gravell करने के लिए। धन्यवाद।

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