2009-09-30 12 views
7

मैं यह जानना चाहता हूं कि प्रोटोकॉल बफर द्वारा समर्थित सूची में शामिल कुछ सामान्य डेटा प्रकार को संग्रहीत करने का इष्टतम तरीका क्या है।प्रोटोकॉल बफर के साथ दशमलव और डेटाटाइम का उपयोग करने का सबसे अच्छा तरीका क्या है?

  • datetime (सेकंड परिशुद्धता)
  • datetime (मिलीसेकेंड परिशुद्धता)
  • निश्चित परिशुद्धता के साथ दशमलव
  • चर परिशुद्धता के साथ दशमलव
  • bool मूल्यों के बहुत सारे (यदि आप उनमें से बहुत यह कैसा दिखता आपके टैग के कारण उनमें से प्रत्येक के लिए 1-2 बाइट ओवरहेड होगा।

यह भी विचार है कि उन्हें correspo के लिए बहुत आसान बनाना है nding सी ++/पायथन/जावा डेटा प्रकार।

उत्तर

3

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

DateTime 
TimeSpan 

यह केवल इसलिए है क्योंकि मैं एक सी # पृष्ठभूमि है, जहां इन प्रकार प्रदान करने के लिए लिया जाता है से आते हैं:

मेरे समाधान दो संदेश प्रकार बनाने के लिए किया गया था।

पीछे की ओर, TimeSpan और DateTime अधिक हो गया हो सकता है, लेकिन यह एच/एम/एस से एस और इसके विपरीत रूपांतरण से बचने का एक "सस्ता" तरीका था; कि ने कहा, यह आसान हो गया होता तो बस जैसे एक उपयोगिता समारोह को लागू करने:

int TimeUtility::ToSeconds(int h, int m, int s) 

Bklyn, कि ढेर स्मृति नेस्टेड संदेशों के लिए प्रयोग किया जाता है ने कहा; कुछ मामलों में यह स्पष्ट रूप से बहुत मान्य है - हमें हमेशा जागरूक होना चाहिए कि स्मृति का उपयोग कैसे किया जाता है। लेकिन, अन्य मामलों में यह कम चिंता का विषय हो सकता है, जहां हम कार्यान्वयन की आसानी के बारे में अधिक चिंतित हैं (यह जावा/सी # दर्शन मुझे लगता है)।

प्रोटोबफ TextFormat::Printer के साथ गैर-आंतरिक प्रकारों का उपयोग करने के लिए भी एक छोटा सा नुकसान है; आप प्रारूप है जिसमें यह प्रदर्शित किया जाता है निर्दिष्ट नहीं कर सकते, तो यह कुछ इस तरह दिखाई देंगे:

my_datetime { 
    seconds: 10 
    minutes: 25 
    hours: 12 
} 

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

निष्कर्ष करने के लिए, मैं कहता हूँ चाहते हैं:

  • आप स्मृति/दक्षता पार्स करने, उपयोग सेकंड/मिलीसेकेंड बारे में चिंतित हैं।
  • हालांकि, अगर कार्यान्वयन में आसानी उद्देश्य है, तो नेस्टेड संदेशों का उपयोग करें (DateTime, आदि)।
2

क्षमा करें, पूरा जवाब नहीं, बल्कि "मुझे भी"।

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

प्रोटो व्याकरण में अपना "डेटटाइम" या "फिक्स्डपॉइंट" संदेश घोषित करना वास्तव में एक समाधान नहीं है, क्योंकि आपको अभी भी जेनरेट की गई वस्तुओं से मैन्युअल रूप से आपके प्लेटफ़ॉर्म के प्रतिनिधित्व को कन्वर्ट करने की आवश्यकता होगी, जो त्रुटि प्रवण है। इसके अतिरिक्त, इन नेस्टेड संदेशों को सी ++ में ढेर-आवंटित ऑब्जेक्ट्स के पॉइंटर्स के रूप में संग्रहीत किया जाता है, जो अंतर्निहित प्रकार मूल रूप से केवल 64-बिट पूर्णांक होता है, जो जंगली रूप से अक्षम होता है।

विशेष रूप से, मैं अपने आद्य फाइलों में कुछ इस तरह लिखने में सक्षम होना चाहता हूँ चाहते हैं:

message Something { 
    required fixed64 time = 1 [cpp_type="boost::posix_time::ptime"]; 
    required int64 price = 2 [cpp_type="fixed_point<int64_t, 4>"]; 
    ... 
}; 

और मैं प्रदान करने के लिए जो कुछ भी गोंद fixed64 से/इन प्रकार परिवर्तित करने के लिए जरूरी हो गया था की आवश्यकता होगी और int64 ताकि serialization काम करेगा। शायद adobe::promote जैसे कुछ के माध्यम से?

3

प्रोटोकॉल बफर के समान तार प्रोटोकॉल के साथ मेरे अनुभव के आधार पर कुछ विचार यहां दिए गए हैं।

datetime (सेकंड परिशुद्धता)

datetime (मिलीसेकेंड परिशुद्धता)

मुझे लगता है कि इन दोनों का जवाब ही होगा, तो आप सिर्फ आम तौर पर संख्या की एक छोटी श्रेणी के साथ काम किया जाएगा सेकंड परिशुद्धता के मामले में।

मिडनाइट जीएमटी 1/1/1970 जैसे कुछ प्रसिद्ध युग से ऑफसेट/मिलीसेकंड में ऑफ़सेट स्टोर करने के लिए एक sint64/sfixed64 का उपयोग करें। यह दिनांक वस्तुएं internally represented in Java कैसे हैं। मुझे यकीन है कि पाइथन और सी ++ में एनालॉग हैं।

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

इस तरह आपके पास तिथि/समय के लिए एक कैननिकल प्रतिनिधित्व है, लेकिन आप जो भी समय क्षेत्र प्रासंगिक हैं, उसे स्थानीयकृत भी कर सकते हैं। निश्चित परिशुद्धता

मेरा पहला विचार के साथ

दशमलव के एक स्ट्रिंग कैसे एक अजगर की दशमलव पैकेज से दशमलव वस्तुओं का निर्माण करने के लिए इसी का प्रयोग है। मुझे लगता है कि कुछ संख्यात्मक प्रतिनिधित्व के सापेक्ष अक्षम हो सकता है।

आप जिस डोमेन के साथ काम कर रहे हैं उसके आधार पर बेहतर समाधान हो सकते हैं। उदाहरण के लिए, यदि आप मौद्रिक मूल्य का मॉडल कर रहे हैं, तो हो सकता है कि आप आंशिक डॉलर की मात्रा के विपरीत सेंट में मूल्य को संवाद करने के लिए uint32/64 का उपयोग कर दूर हो जाएं।

this thread में कुछ उपयोगी सुझाव भी दिए गए हैं।

चर परिशुद्धता के साथ दशमलव

प्रोटोकॉल बफ़र पहले से ही नाव/डबल अदिश प्रकार के साथ इस का समर्थन नहीं करता है? शायद मैंने इस बुलेट बिंदु को गलत समझा है।

वैसे भी, यदि आपको उन स्केलर प्रकारों के आसपास जाने की आवश्यकता है, तो आप आईईईई -754 का उपयोग यूंट 32 या यूंट 64 (फ्लोट बनाम डबल क्रमशः) में एन्कोड कर सकते हैं। उदाहरण के लिए, फ्लोट/डबल ऑब्जेक्ट्स से जावा allows you to extract the IEEE-754 representation और vice versa। सी ++/पायथन में समान तंत्र हैं।

bool मूल्यों के बहुत सारे (यदि आप बहुत उनमें से ऐसा लगता है कि आप को उनके टैग वजह से उनमें से प्रत्येक के लिए 1-2 बाइट्स भूमि के ऊपर होगा।

आप कर रहे हैं तार पर बर्बाद बाइट्स के बारे में चिंतित, आप bit-masking techniques का उपयोग कई बूलियन को एक एकल यूंट 32 या यूआईंट 64 में संपीड़ित करने के लिए कर सकते हैं।

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

1

मिलीसेकंड संकल्प के साथ दिनांक के लिए मैं एक int64YYYYMMDDHHMMSSmmm के रूप में दिनांक है कि इस्तेमाल किया। यह दोनों संक्षिप्त और पठनीय बनाता है, और आश्चर्य की बात है, एक बहुत लंबे समय तक चलेगा।

decimals के लिए, मैंने byte[] का उपयोग किया, यह जानकर कि कोई बेहतर प्रतिनिधित्व नहीं है जो हानिकारक नहीं होगा।

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

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