2016-02-25 7 views
6

को देखते हुए (सरलीकृत वर्णन)रिप्लेसमेंट .net शब्दकोश

हमारी सेवाओं में से एक स्मृति में उदाहरणों की एक बहुत कुछ है। लगभग 85% अद्वितीय हैं। हमें बहुत तेज़ इन वस्तुओं की कुंजी आधारित पहुंच की आवश्यकता है क्योंकि उन्हें से पूछताछ की जाती है, अक्सर एक ही स्टैक/कॉल में। यह एकल संदर्भ अत्यंत प्रदर्शन अनुकूलित है।

इसलिए हमने उन्हें एक शब्दकोश में डालना शुरू कर दिया। प्रदर्शन ठीक था।

जितनी जल्दी हो सके आइटम तक पहुंच इस मामले में सबसे महत्वपूर्ण बात है। यह सुनिश्चित किया जाता है कि पढ़ने के दौरान कोई लेखन कार्य नहीं होता है।

समस्या

इस बीच हम आइटम एक शब्दकोश स्टोर कर सकते हैं की संख्या की सीमा मारा।

Die Arraydimensionen haben den unterstützten Bereich überschritten. 
    bei System.Collections.Generic.Dictionary`2.Resize(Int32 newSize, Boolean forceNewHashCodes) 
    bei System.Collections.Generic.Dictionary`2.Insert(TKey key, TValue value, Boolean add) 

जो The array dimensions have exceeded the supported range में अनुवाद करता है।

मेमकैड जैसे समाधान इस विशिष्ट मामले में बहुत धीमे हैं। यह एक एकल सेवा

में एक पृथक विशिष्ट विशिष्ट उपयोग केस है, इसलिए हम इस विशिष्ट परिदृश्य के लिए शब्दकोश के प्रतिस्थापन की तलाश में हैं।

वर्तमान में मुझे इसका समर्थन नहीं मिल रहा है। क्या मैं कुछ भूल रहा हूँ? क्या कोई मुझे एक को इंगित कर सकता है?

वैकल्पिक रूप से, यदि कोई अस्तित्व में नहीं है तो हम खुद को एक लागू करने के बारे में सोच रहे हैं।

हमने दो संभावनाओं के बारे में सोचा। स्क्रैच से या कई शब्दकोशों को लपेटने से इसे बनाएं।

रैपिंग कई शब्दकोशों

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

मुझे पता है कि शब्दकोश की तरह एक बेसटाइप का आदान-प्रदान करना पूर्ण अंतिम संभावना है और मैं इसे टालना चाहता हूं। लेकिन वर्तमान में ऐसा लगता है कि वस्तुओं को अधिक अद्वितीय बनाने या किसी डेटाबेस से शब्दकोश का प्रदर्शन करने या कहीं और प्रदर्शन को बचाने के लिए कोई रास्ता नहीं है।

मुझे "अनुकूलन के बारे में जागरूक होने" के बारे में भी पता है, लेकिन कम प्रदर्शन से इसके पीछे व्यावसायिक आवश्यकताओं को बहुत बुरी तरह प्रभावित किया जाएगा।

+0

आप जिस सीमा तक पहुंचे थे? 2^31? –

+0

मुझे यकीन नहीं है कि इसकी गिनती या तत्व का ऑब्जेक्ट आकार गीला है, मैं वर्तमान में इसमें कुछ लॉगिंग कोड जोड़ रहा हूं। लेकिन सेवाओं की परिस्थितियों के कारण मुझे परिणाम बहुत जल्दी नहीं मिल सकते हैं –

+0

इसके अलावा, क्या आप शब्दकोश में जो प्रकार जोड़ रहे हैं, उसके कार्यान्वयन को नियंत्रित करते हैं? यदि ऐसा है, तो आप कम से कम हैश कोड को कैश कर सकते हैं ताकि इसे अनावश्यक रूप से दोबारा नहीं बदला जा सके। –

उत्तर

2

इससे पहले कि मैंने आपके प्रश्नों को पढ़ना समाप्त कर दिया, सरल एकाधिक शब्दकोश मेरे दिमाग में आए। लेकिन आप पहले से ही इस समाधान को जानते हैं। मुझे लगता है कि आप वास्तव में एक शब्दकोश में अधिकतम संख्या में आइटम मार रहे हैं, कोई अन्य सीमा नहीं।

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

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

2

मैंने .Net Dictionary के कार्यान्वयन को देखा है और ऐसा लगता है कि आप अपने शब्दकोश में 2^32 मानों को स्टोर करने में सक्षम होना चाहिए। (बाल्टी की सूची के बगल में, जो स्वयं से जुड़ी सूचियां हैं, वहां एक एकल सरणी है जो सभी वस्तुओं को स्टोर करती है, शायद त्वरित पुनरावृत्ति के लिए, यह सीमित कारक हो सकती है)।

यदि आपने 2^32 मान जोड़े नहीं हैं तो यह हो सकता है कि बाल्टी में वस्तुओं पर एक सीमा हो (इसकी एक लिंक्ड सूची है, इसलिए यह शायद अधिकतम स्टैकफ्रेम आकार तक सीमित है)। उस स्थिति में आपको दोबारा जांच करनी चाहिए कि आपका हैशिंग फ़ंक्शन शब्दकोश को समान रूप से समान रूप से फैलाता है। अधिक जानकारी के लिए यह उत्तर देखें What is the best algorithm for an overridden System.Object.GetHashCode?

+0

अच्छा बिंदु .मैं ठीक कहता हूं लेकिन मैं इसे दो बार देखूंगा। यह भी उम्मीद की जाती है कि यह और भी ऑब्जेक्ट्स बन जाएगा –

+0

क्या आप जानते हैं कि अब कितनी ऑब्जेक्ट्स हैं? –

+0

इस समय बिल्कुल नहीं, मैं 1,2 दिनों में नहीं हूं, यह वहां एक लॉग संस्करण प्रकाशित करना इतना आसान नहीं है –

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