2017-02-18 7 views
10

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

message All { 
    repeated Line lines = 1; 
    Common common = 2; 
} 

लाइन वस्तु के एक जोड़े सैकड़ों रहे हैं, प्रत्येक पंक्ति काफी जटिल है और अपने आप ही ~ 100 kB लेता है।

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

धन्यवाद!

+0

क्या आपने कई सीमांकित संदेशों का उपयोग करने पर विचार किया है ??? –

+0

"आंशिक डेटा लोड करना संभव है" नहीं। आपको उन्हें अलग संदेशों में स्टोर करने की आवश्यकता होगी। –

+0

मैं इसे अर्हता प्राप्त करूंगा: आप तार-स्वरूपित प्रोटोकॉल बफर के हिस्सों में जा सकते हैं, क्योंकि संदेश का आकार ज्ञात है। लेकिन ऐसा लगता है कि पढ़ने के लिए प्रासंगिक सामान निर्धारित करने के लिए आपको 'लाइन' संदेश पढ़ना होगा। शायद आपके पास दूसरा क्षेत्र हो सकता है, जैसे 'दोहराई गई रेखा मूलभूत रेखाएं'; लेकिन आपको अभी भी अपनी रुचि रखने वाली चीज़ों को निकालने के लिए कस्टम पार्सर लिखना होगा। –

उत्तर

0

आपके द्वारा दिए गए सीमित विनिर्देश से, उचित प्रतिक्रिया देना बहुत मुश्किल है। आपने कहा है कि आपकी समस्या के लिए सबसे अच्छा समाधान प्रोटोबफ प्रतीत होता है, लेकिन हम उसे दी गई जानकारी से पुन: प्राप्त नहीं कर सकते हैं।

आपने जो लिखा है उसके आधार पर मैं यह भी कहूंगा कि एक साधारण GZIPped बाइट सरणी (या JSON जितना अधिक प्रिंट करने योग्य है (आपने कहा है कि वे String एस हैं)) आपके लिए बेहतर हो सकता है ("बहुत सारी चीज़ें" लाइन ऑब्जेक्ट्स => जीजेआईपी चट्टान चलेगा)।

और जैसा कि अन्य ने कहा: प्रोटोबफ के साथ "आंशिक डेटा संरचनाओं" को लोड करना संभव नहीं है (वास्तव में आपका "आंशिक" नहीं होगा, जब तक "दोहराया" भाग उदाहरण के लिए, Collection है, क्योंकि प्रोटोबफ की तुलना में संरचना में अपने डेटा को विभाजित करने की देखभाल)।

मैं अपने दो सेंट GZIPped जेएसओएन धाराओं (उदाहरण के लिए, जैक्सन के साथ) पर रखूंगा, निश्चित रूप से आप इस मामले में बैंडविड्थ को CPU चक्रों की लागत से कम कर देंगे।

+1

आप सही हैं कि मुझे अपना विस्तार करना चाहिए मेरी आवश्यकताओं को न्यायसंगत बनाने के लिए उदाहरण, मुझे जल्द ही ऐसा करना चाहिए। हालांकि मैं आपके साथ कुछ बिंदुओं से असहमत हूं: बाइट सरणी मेरा वर्तमान दृष्टिकोण है और मैं आपको बता सकता हूं कि यह वास्तव में स्केल नहीं करता है और बहुत ही त्रुटि प्रवण है। मैं protobuf के परिणाम gzip करने की योजना है तो जेसन वैसे भी बड़ा होगा। प्लस deserializing पुराने फोन पर जेसन ध्यान देने योग्य अंतराल (सीपीयू चक्र) जोड़ देगा, साथ ही एक ही स्ट्रिंग की कई प्रतियों को लोड करने से स्मृति दबाव जोड़ा जाएगा।इसके अलावा मेरी संरचना में इन्ट्स की बहु आयामी सरणी है, जो प्रोटोबफ की तुलना में जेसन में काफी अधिक जगह लेगी। – MichalMa

+0

जैक्सन के साथ ऑब्जेक्ट संदर्भों का उपयोग करना भी संभव है ⇒ एक ही स्ट्रिंग marshalled स्ट्रिंग में दो बार नहीं होगी;) लेकिन हाँ, मैं सहमत हूं, यह वास्तव में सटीक उपयोग-मामले पर निर्भर है। –

0

आंशिक डेटा लोड करने के संबंध में अपने स्वयं के प्रश्न का उत्तर दें। मैं अभी तक व्यवहार में इसे करने की कोशिश नहीं की है, लेकिन मुझे आश्चर्य है अगर निम्नलिखित कार्य नहीं करेगा:

message All { 
    repeated Line lines = 1; 
    Common common = 2; 
} 

message All_partial { 
    Common common = 2; 
} 

proto3 में सभी क्षेत्रों के रूप में वैकल्पिक कर रहे हैं, हम अपने संरचना के दूसरी परिभाषा हो सकता है, "आंशिक" क्षेत्रों के साथ । अगर हम एक ही क्षेत्र संख्या रखते हैं, तो मुझे उम्मीद है कि हम ठीक होंगे।

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