को देखते हुए (सरलीकृत वर्णन)रिप्लेसमेंट .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 पर एक नजर है और रैपर शब्दकोशों की सूची के लिए एक सूचकांक की तरह अपनी शुरुआती नंबर का उपयोग कर सकते हैं। यद्यपि यह आसान लगता है कि यह मेरे लिए गंध करता है और इसका मतलब यह होगा कि हैशकोड की गणना दो बार की जाती है (एक बार हमारे द्वारा आंतरिक शब्दकोष द्वारा एक बार) (यह परिदृश्य वास्तव में वास्तव में क्रांतिकारी प्रदर्शन है)।
मुझे पता है कि शब्दकोश की तरह एक बेसटाइप का आदान-प्रदान करना पूर्ण अंतिम संभावना है और मैं इसे टालना चाहता हूं। लेकिन वर्तमान में ऐसा लगता है कि वस्तुओं को अधिक अद्वितीय बनाने या किसी डेटाबेस से शब्दकोश का प्रदर्शन करने या कहीं और प्रदर्शन को बचाने के लिए कोई रास्ता नहीं है।
मुझे "अनुकूलन के बारे में जागरूक होने" के बारे में भी पता है, लेकिन कम प्रदर्शन से इसके पीछे व्यावसायिक आवश्यकताओं को बहुत बुरी तरह प्रभावित किया जाएगा।
आप जिस सीमा तक पहुंचे थे? 2^31? –
मुझे यकीन नहीं है कि इसकी गिनती या तत्व का ऑब्जेक्ट आकार गीला है, मैं वर्तमान में इसमें कुछ लॉगिंग कोड जोड़ रहा हूं। लेकिन सेवाओं की परिस्थितियों के कारण मुझे परिणाम बहुत जल्दी नहीं मिल सकते हैं –
इसके अलावा, क्या आप शब्दकोश में जो प्रकार जोड़ रहे हैं, उसके कार्यान्वयन को नियंत्रित करते हैं? यदि ऐसा है, तो आप कम से कम हैश कोड को कैश कर सकते हैं ताकि इसे अनावश्यक रूप से दोबारा नहीं बदला जा सके। –