2015-11-26 6 views
6

ज़िगज़ैग को लिखने/पढ़ने के लिए बहुत अधिक ओवरहेड की आवश्यकता है। असल में मैं यह देखने के लिए डर गया था कि यह सिर्फ int/long मानों को लिखता नहीं है, लेकिन बहुत अधिक स्कैम्बलिंग करता है। यहां तक ​​कि एक पाश शामिल है: https://github.com/mardambey/mypipe/blob/master/avro/lang/java/avro/src/main/java/org/apache/avro/io/DirectBinaryEncoder.java#L90प्रोटोकॉल बफर और एवरो में ज़िगज़ैग एन्कोडिंग के पीछे क्या कारण है?

मैं प्रोटोकॉल बफ़र डॉक्स में या एवरो डॉक्स में मिल जाए, या कारण अपने आप करने में सक्षम हो ऐसा नहीं लगता है, ऐसे ही संख्या पांव मार का लाभ क्या है? एन्कोडिंग के बाद सकारात्मक और नकारात्मक संख्याओं को बदलने के लिए बेहतर क्यों है?

क्यों वे केवल छोटे-अंत, बड़े-एंडियन, नेटवर्क ऑर्डर में लिखे गए हैं, जो केवल उन्हें स्मृति में पढ़ने की आवश्यकता होगी और संभवतः थोड़ा अंतहीनता को उलट देगा? हम प्रदर्शन के साथ भुगतान क्या खरीदते हैं?

+2

यदि आप कुछ प्रोटोबफ में रूचि रखते हैं जैसे कि महंगा वैरिंट एन्कोडिंग नहीं करता है, तो https://capnproto.org देखें। यह तेज़ है लेकिन यह तार पर अधिक जगह लेता है। (प्रकटीकरण: मैं कैप प्रोटो के लेखक हूं और Google के अधिकांश ओपन सोर्स प्रोटोबफ कोड के लेखक भी हैं।) –

+0

@ केंटनवर्डा जानकारी के लिए धन्यवाद, मुझे कैपप्रोटो से अवगत नहीं था। मेरे प्रोटोकॉल टूलबल्ट में जोड़ा गया। – Endrju

+0

प्रोटोकॉल बफर, कम से कम संस्करण 2 के रूप में, आप निश्चित आकार एन्कोडेड पूर्णांक (उदा। - निश्चित 32, sfixed64, आदि) का उपयोग करते हैं, यदि यह आपके एप्लिकेशन के लिए अधिक समझ में आता है। उदाहरण के लिए, यदि आपके मान समान रूप से मूल्यों की संभावित सीमा में वितरित किए जाएंगे, तो आप परिवर्तनीय रूप के बजाय निश्चित रूप का उपयोग करना चाहते हैं। ऐसा कहा जा रहा है कि, सामान्य रूप से उपयोग किए गए मानों के लिए शून्य के करीब क्लस्टर करने के लिए यह बहुत आम है जहां इस प्रकार की सरल परिवर्तनीय लंबाई एन्कोडिंग बहुत अधिक जगह बचा सकती है। – jschultz410

उत्तर

8

यह एक परिवर्तनीय लंबाई 7-बिट एन्कोडिंग है। एन्कोडेड मान के पहले बाइट में यह 0 से थोड़ा अधिक सेट हो गया है, इसके बाद बाइट्स में यह 1 है। डिकोडर यह बता सकता है कि मूल्य को एन्कोड करने के लिए कितने बाइट्स का उपयोग किया गया था। मशीन आर्किटेक्चर के बावजूद बाइट ऑर्डर हमेशा थोड़ा-अंत होता है।

यह एक एन्कोडिंग चाल है जो मूल्य को एन्कोड करने के लिए आवश्यक कुछ बाइट्स के रूप में लिखने की अनुमति देती है। तो एक 8 बाइट लंबे -64 और 63 के बीच एक मान के साथ केवल एक बाइट लेता है। जो आम है, लंबे द्वारा प्रदान की गई श्रृंखला का अभ्यास शायद ही कभी किया जाता है।

एक जीजीआईपी-शैली संपीड़न विधि के ऊपरी हिस्से के बिना डेटा को कसकर पैक करना डिजाइन लक्ष्य था। .NET Framework में भी उपयोग किया जाता है। मूल्य को एनकोड करने के लिए आवश्यक प्रोसेसर ओवरहेड अपरिहार्य है। एक संपीड़न योजना से काफी कम है, यह आई/ओ लागत का एक बहुत छोटा हिस्सा है।

+1

बहुत बहुत धन्यवाद। तुम्हारी मदद के लिए शुक्रिया। अब यह सही समझ में आता है। मैं खो गया हूं, क्योंकि मैंने जावा स्रोतों को देखना शुरू कर दिया है जो [कुछ स्थानों पर अनावश्यक रूप से खराब हो गए हैं] (https://github.com/mardambey/mypipe/blob/master/avro/lang/java/avro/src /main/java/org/apache/avro/io/BinaryDecoder.java#L195)। भगवान, क्या जावा को वास्तव में काम करने के लिए हाथ से तैयार किए गए लूप अनोलिंग कोड की आवश्यकता है? – Endrju

+0

@ एंड्रजू: निम्न स्तर के लाइब्रेरी प्रोटोकॉल के लिए प्रदर्शन आवश्यकताओं अविश्वसनीय रूप से उच्च हैं, क्योंकि ऐसे पुस्तकालयों के उपयोगकर्ता इतने भारी रूप से भिन्न होते हैं। पुस्तकालय कोड में ग्राहकों का एक बहुत ही विविध संग्रह है, जिनमें से कुछ में कठिन प्रदर्शन आवश्यकताओं हैं। इसके अलावा, लाइब्रेरी कोड में बाधा बनने की प्रवृत्ति है, इसलिए पुस्तकालयों को अनुकूलित करना अक्सर महत्वपूर्ण होता है। पुस्तकालयों का चयन करते समय प्रदर्शन अक्सर प्राथमिक चिंता होती है। – Brian

+0

@ ब्रायन मुझे पता है मुझे पता है लेकिन ... लूप अनलॉकिंग? उन सभी वर्षों और संस्करणों के बाद जावा जिटर नहीं कर सकते हैं जो समान रूप से अच्छे हैं - या बेहतर? ... – Endrju

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