2012-01-10 10 views
5

मैंने मुख्य मूल्य स्टोर की खोज की है जो पूर्णांक कुंजी और पूर्णांक मानों का समर्थन करता है। लेवलडीबी एक अच्छा विकल्प प्रतीत होता है, हालांकि मुझे कोई जानकारी नहीं मिलती है कि पूर्णांक मान/कुंजी समर्थित हैंक्या स्तर डीबी में पूर्णांक कुंजी/मान संग्रहीत किए जा सकते हैं?

उत्तर

10

आप LevelDB में बहुत कुछ स्टोर कर सकते हैं। आप Slice संरचना के माध्यम से लेवल डीबी में डेटा के अपारदर्शी स्लाइस प्रदान करते हैं। यहां एक उदाहरण दिया गया है:

int intKey = 256; 
int intValue = 256*256; 

Slice key((char*)&intKey, sizeof(int)); 
Slice value((char*)&intValue, sizeof(int)); 

db->Put(leveldb::WriteOptions(), key, value); 

और यह बहुत अधिक है!

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

आप Comparator इंटरफ़ेस के माध्यम से अपना खुद का तुलनित्र भी लिख सकते हैं जो आपको डिफ़ॉल्ट BytewiseComparator को प्रतिस्थापित करने की अनुमति देगा।

+0

लेकिन गेट मुझे सही टुकड़ा नहीं देता है? यदि डेटा '0' नहीं है तो यह कैसे काम करेगा? या मुझसे यहां कुछ छूट रहा है? – vinothkr

+0

एक std :: स्ट्रिंग प्राप्त करें जिसमें एक मनमाना बाइट सरणी हो सकती है। आप एक इटरेटर का उपयोग भी कर सकते हैं और इसकी तलाश कर सकते हैं, किसी भी प्रतिलिपि के बिना मूल्य को इंगित करने वाली स्लाइस प्राप्त करने में सक्षम होने के लिए। यह बहुत बड़े मूल्यों के लिए अनुशंसित दृष्टिकोण है। –

1

कई मामलों में पूर्णांक कुंजी के लिए एक और विस्तृत एन्कोडिंग योजना बेहतर विकल्प है। एक char * में अपने दो पूरक पूरक में एक int पैकिंग (जैसा कि इस प्रश्न के दूसरे उत्तर में सुझाया गया है) एक विकल्प है; varint एन्कोडिंग एक और है (छोटे पूर्णांक के लिए जगह बचाता है, ऊपरी बाउंड के बिना मनमानी संख्या स्टोर कर सकते हैं)।

+0

क्या दो-पूरक विधि का अनुकूलन नहीं है? – amirouche

+1

संख्या। varints (जिसमें एकाधिक रूप हैं) एक चर आकार का उपयोग करते हैं, जबकि दो पूरक संख्या एक निश्चित आकार का उपयोग करते हैं। इसका मतलब है कि वेरिएंट सैद्धांतिक रूप से असंबद्ध हैं (लेकिन व्यावहारिक कार्यान्वयन में नहीं), जबकि दो पूरक संख्याओं में -2^n से 2^n-1 की एक श्रृंखला है। भी, varints नकारात्मक संख्याओं के लिए zigzag एन्कोडिंग की आवश्यकता है, जबकि 2 पूरक उस के लिए एक संकेत बिट आरक्षित करता है। –

0

लिंक के उत्तर पर विस्तार करने के लिए, आंशिक रूप से क्योंकि मैं जिस पुस्तक को लिख रहा हूं, उसके हिस्से के रूप में मैं इस सटीक चीज़ के साथ खेल रहा हूं, आप नीचे बताए गए वही कॉम्पैपरेटर परिणामों को देख सकते हैं।

एक और तरीका अपने बाइनरी पूर्णांक को बड़े एंडियन प्रारूप में फ़्लिप करना है ताकि वे डिफ़ॉल्ट तुलनित्र के साथ ठीक हो जाएंगे। यह चाबियाँ लिखना आसान बनाता है। long flippedI = htonl(i);

ध्यान दें कि LevelDB बहुत तेज़ है। मैंने आईफोन 4 पर परीक्षण किया है जिसमें माध्यमिक कुंजी के साथ 50,000 टेक्स्ट-कीड रिकॉर्ड हैं, इसलिए लगभग 100,000 कुंजी/मूल्य जोड़े और यह चिल्लाती है।

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

एक छोटा रास्ता यह कहना होगा कि सभी गैर-पूर्णांक कुंजी 4 वर्णों से अधिक लंबी हैं, इसलिए आप मानते हैं कि 4 बाइट कुंजी एक पूर्णांक है। इसका मतलब है कि आपको यह सुनिश्चित करने की ज़रूरत है कि आप उसे पीछे खींचने के लिए पिछली जगह या कुछ और जोड़ दें। यह सब बहुत मनमानी और आप पर निर्भर है लेकिन याद रखें कि आपके पास मौजूद जानकारी के केवल दो टुकड़े महत्वपूर्ण सामग्री और इसकी लंबाई हैं। किसी दिए गए कुंजी के लिए कोई अन्य मेटाडेटा नहीं है। पूर्णांक कुंजी 1 से शुरू करने के लिए और 1000 1 से ऊपर जाने, मानक BytewiseComparator

Listing the keys in decimal and hex 
256 (100) 
512 (200) 
768 (300) 
    1 ( 1) 
257 (101) 
513 (201) 
769 (301) 
    2 ( 2) 
258 (102) 
514 (202) 
770 (302) 
    3 ( 3) 
259 (103) 
515 (203) 
771 (303) 
... 
254 ( fe) 
510 (1fe) 
766 (2fe) 
255 ( ff) 
511 (1ff) 
767 (2ff) 
+0

आपका मतलब है कि बड़े-एंडियन ऑर्डर में फ्लिप करें, न कि छोटे-एंडियन। आपने अपने उदाहरण में "htonl" का उपयोग किया जिसका अर्थ है "नेटवर्क पर होस्ट करें" और नेटवर्क बाइट ऑर्डर बड़ा-एंडियन है। लेवलडीबी अन्य पुराने डेटाबेस की तुलना में तेज़ हो सकता है, लेकिन यह एलएमडीबी की तुलना में काफी धीमी है। – hyc

+0

एंडियननेस पर सुधार के लिए धन्यवाद। –

0

LMDB के साथ एक डेटाबेस का उपयोग कर के साथ मानक तुलनित्र के लिए एक नमूना से प्राप्त परिणामों का

भाग पूर्णांक चाबी के लिए स्पष्ट समर्थन हासिल है (और मान, यदि आप सॉर्ट किए गए डुप्लिकेट का उपयोग कर रहे हैं)। http://symas.com/mdb

जब एक डीबी पूर्णांक कुंजी के लिए कॉन्फ़िगर किया गया है, तो मुख्य तुलना फ़ंक्शन भी बहुत तेज़ होते हैं क्योंकि वे डिफ़ॉल्ट स्ट्रिंग-ओरिएंटेड तुलना के रूप में केवल बाइट-एट-टाइम के बजाय शब्द-दर-समय की तुलना कर सकते हैं कर देता है।

अस्वीकरण: मैं एलएमडीबी का लेखक हूं। बेशक, यह तथ्यों को अलग नहीं करता है।

+1

सवाल LevelDB के बारे में था। एलएमडीबी को बढ़ावा देने की कोशिश कर रहे अन्य प्रश्नों को स्पैम करना बंद करें। –

+0

सवाल कहता है "मैंने खोजा है" जिसका अर्थ है कि वह अभी भी विकल्पों की तलाश में है। और लेवलडीबी एक सिद्ध रूप से निम्न विकल्प है, और एलएमडीबी एक सिद्ध रूप से बेहतर विकल्प है। – hyc

+0

@hyc जो आपकी आवश्यकताओं पर निर्भर करता है। मैंने अभी एलएमडीबी की समीक्षा की है और इसे पूरी तरह से अनुपयुक्त पाया है, फिर भी लेवलडीबी सिर्फ वही करता है जो मुझे चाहिए। – Alnitak

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