मैंने मुख्य मूल्य स्टोर की खोज की है जो पूर्णांक कुंजी और पूर्णांक मानों का समर्थन करता है। लेवलडीबी एक अच्छा विकल्प प्रतीत होता है, हालांकि मुझे कोई जानकारी नहीं मिलती है कि पूर्णांक मान/कुंजी समर्थित हैंक्या स्तर डीबी में पूर्णांक कुंजी/मान संग्रहीत किए जा सकते हैं?
उत्तर
आप 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
को प्रतिस्थापित करने की अनुमति देगा।
कई मामलों में पूर्णांक कुंजी के लिए एक और विस्तृत एन्कोडिंग योजना बेहतर विकल्प है। एक char * में अपने दो पूरक पूरक में एक int पैकिंग (जैसा कि इस प्रश्न के दूसरे उत्तर में सुझाया गया है) एक विकल्प है; varint एन्कोडिंग एक और है (छोटे पूर्णांक के लिए जगह बचाता है, ऊपरी बाउंड के बिना मनमानी संख्या स्टोर कर सकते हैं)।
क्या दो-पूरक विधि का अनुकूलन नहीं है? – amirouche
संख्या। varints (जिसमें एकाधिक रूप हैं) एक चर आकार का उपयोग करते हैं, जबकि दो पूरक संख्या एक निश्चित आकार का उपयोग करते हैं। इसका मतलब है कि वेरिएंट सैद्धांतिक रूप से असंबद्ध हैं (लेकिन व्यावहारिक कार्यान्वयन में नहीं), जबकि दो पूरक संख्याओं में -2^n से 2^n-1 की एक श्रृंखला है। भी, varints नकारात्मक संख्याओं के लिए zigzag एन्कोडिंग की आवश्यकता है, जबकि 2 पूरक उस के लिए एक संकेत बिट आरक्षित करता है। –
लिंक के उत्तर पर विस्तार करने के लिए, आंशिक रूप से क्योंकि मैं जिस पुस्तक को लिख रहा हूं, उसके हिस्से के रूप में मैं इस सटीक चीज़ के साथ खेल रहा हूं, आप नीचे बताए गए वही कॉम्पैपरेटर परिणामों को देख सकते हैं।
एक और तरीका अपने बाइनरी पूर्णांक को बड़े एंडियन प्रारूप में फ़्लिप करना है ताकि वे डिफ़ॉल्ट तुलनित्र के साथ ठीक हो जाएंगे। यह चाबियाँ लिखना आसान बनाता है। 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)
आपका मतलब है कि बड़े-एंडियन ऑर्डर में फ्लिप करें, न कि छोटे-एंडियन। आपने अपने उदाहरण में "htonl" का उपयोग किया जिसका अर्थ है "नेटवर्क पर होस्ट करें" और नेटवर्क बाइट ऑर्डर बड़ा-एंडियन है। लेवलडीबी अन्य पुराने डेटाबेस की तुलना में तेज़ हो सकता है, लेकिन यह एलएमडीबी की तुलना में काफी धीमी है। – hyc
एंडियननेस पर सुधार के लिए धन्यवाद। –
LMDB के साथ एक डेटाबेस का उपयोग कर के साथ मानक तुलनित्र के लिए एक नमूना से प्राप्त परिणामों का
भाग पूर्णांक चाबी के लिए स्पष्ट समर्थन हासिल है (और मान, यदि आप सॉर्ट किए गए डुप्लिकेट का उपयोग कर रहे हैं)। http://symas.com/mdb
जब एक डीबी पूर्णांक कुंजी के लिए कॉन्फ़िगर किया गया है, तो मुख्य तुलना फ़ंक्शन भी बहुत तेज़ होते हैं क्योंकि वे डिफ़ॉल्ट स्ट्रिंग-ओरिएंटेड तुलना के रूप में केवल बाइट-एट-टाइम के बजाय शब्द-दर-समय की तुलना कर सकते हैं कर देता है।
अस्वीकरण: मैं एलएमडीबी का लेखक हूं। बेशक, यह तथ्यों को अलग नहीं करता है।
सवाल LevelDB के बारे में था। एलएमडीबी को बढ़ावा देने की कोशिश कर रहे अन्य प्रश्नों को स्पैम करना बंद करें। –
सवाल कहता है "मैंने खोजा है" जिसका अर्थ है कि वह अभी भी विकल्पों की तलाश में है। और लेवलडीबी एक सिद्ध रूप से निम्न विकल्प है, और एलएमडीबी एक सिद्ध रूप से बेहतर विकल्प है। – hyc
@hyc जो आपकी आवश्यकताओं पर निर्भर करता है। मैंने अभी एलएमडीबी की समीक्षा की है और इसे पूरी तरह से अनुपयुक्त पाया है, फिर भी लेवलडीबी सिर्फ वही करता है जो मुझे चाहिए। – Alnitak
- 1. फ़ंक्शंस/फ़ैक्टर। क्या वे संग्रहीत किए जा सकते हैं?
- 2. क्या सिल्वरलाइट ऐप्स PowerPoint में एम्बेड किए जा सकते हैं?
- 3. कुछ अच्छे PHP प्रोफाइलर्स क्या उपयोग किए जा सकते हैं?
- 4. क्या रेजर विचार संकलित किए जा सकते हैं?
- 5. क्या बनावट से सामान्य मानचित्र उत्पन्न किए जा सकते हैं?
- 6. Google play में कितने ऐप्स प्रकाशित किए जा सकते हैं?
- 7. सर्कल में कितने वर्ग पैक किए जा सकते हैं?
- 8. क्या स्तर डीबी स्नैपशॉट डेटाबेस के करीब जीवित रह सकते हैं?
- 9. सदस्य चर क्यों साझा नहीं किए जा सकते हैं?
- 10. क्या किसी सरणी में पूर्णांक हो सकते हैं और
- 11. क्या एक्सएसएस हमले एक लिंक किए गए स्टाइलशीट के भीतर से किए जा सकते हैं?
- 12. डिस्जिइंट सेट पर कौन से ऑपरेशन किए जा सकते हैं?
- 13. क्या PHP सत्र मैन्युअल रूप से संपादित किए जा सकते हैं?
- 14. क्या आप सीमित कर सकते हैं कि MATLAB GUI संपादन बॉक्स में कौन से वर्ण टाइप किए जा सकते हैं?
- 15. क्या मोंगो डीबी अनुमानित हैं?
- 16. hbm.xml में मैप किए गए गुण क्षणिक हो सकते हैं?
- 17. क्या ईएमबी 3 में रिमोट स्टेटलेस सत्र बीन संदर्भ कैश किए जा सकते हैं?
- 18. क्या जीपीएलवी 2 के साथ लाइसेंस प्राप्त पुस्तकालय मालिकाना अनुप्रयोगों में उपयोग किए जा सकते हैं?
- 19. क्या प्रोफाइलर टेम्पलेट्स एसक्यूएल प्रोफाइलर के नए संस्करणों में माइग्रेट किए जा सकते हैं?
- 20. क्या एमएल फ़ैक्टर पूरी तरह से .NET (सी #/एफ #) में एन्कोड किए जा सकते हैं?
- 21. क्यों नहीं कर सकते पूर्णांक ** C++ में स्थिरांक पूर्णांक ** लिए परिवर्तित किया जा
- 22. क्या एमवीसीसीओन्ट्रिब ग्रिड में पाद लेख जोड़े जा सकते हैं?
- 23. प्रतिबंधित किए बिना Google मानचित्र API पर कितने अनुरोध किए जा सकते हैं?
- 24. डेटाबेस में उपयोगकर्ता पहुंच स्तर को संग्रहीत करना
- 25. पहले एक चर घोषित किए बिना संदर्भ किए जा सकते हैं?
- 26. क्या सभी पुनरावृत्त एल्गोरिदम रिकर्सिव रूप से व्यक्त किए जा सकते हैं?
- 27. क्या स्ट्रिंग-आधारित उपयोगकर्ता-परिभाषित अक्षर दृढ़ता से टाइप किए जा सकते हैं?
- 28. क्या perf.data फ़ाइल से perf-stat परिणाम उत्पन्न किए जा सकते हैं?
- 29. क्या कई त्वरक JMenuItem के लिए परिभाषित किए जा सकते हैं?
- 30. jQuery परिवर्तनीय एचटीएमएल एक चरणीय में संग्रहीत कर सकते हैं?
लेकिन गेट मुझे सही टुकड़ा नहीं देता है? यदि डेटा '0' नहीं है तो यह कैसे काम करेगा? या मुझसे यहां कुछ छूट रहा है? – vinothkr
एक std :: स्ट्रिंग प्राप्त करें जिसमें एक मनमाना बाइट सरणी हो सकती है। आप एक इटरेटर का उपयोग भी कर सकते हैं और इसकी तलाश कर सकते हैं, किसी भी प्रतिलिपि के बिना मूल्य को इंगित करने वाली स्लाइस प्राप्त करने में सक्षम होने के लिए। यह बहुत बड़े मूल्यों के लिए अनुशंसित दृष्टिकोण है। –