C # में एक हैशटेबल और डिक्शनरी का व्यावहारिक आकार सीमा


12

C # 4 डिक्शनरी या हैशटेबल में आइटम की संख्या के लिए व्यावहारिक सीमाएं क्या हो सकती हैं और बाइट्स की कुल संख्या इन संरचनाओं को उचित रूप से समाहित कर सकती है। मैं बड़ी संख्या में वस्तुओं के साथ काम कर रहा हूं और जानना चाहता हूं कि ये संरचनाएं मुद्दों का अनुभव कब शुरू करती हैं।

संदर्भ के लिए, मैं मेमोरी के टन के साथ 64 बिट सिस्टम का उपयोग करूंगा। इसके अलावा, मुझे कुछ फॉर्म या 'की' का उपयोग करके ऑब्जेक्ट खोजने होंगे। प्रदर्शन की मांगों को देखते हुए, इन वस्तुओं को स्मृति में निवास करने की आवश्यकता होगी, और कई लंबे समय तक जीवित रहेंगे।

अन्य दृष्टिकोणों / प्रतिमानों का सुझाव देने के लिए स्वतंत्र महसूस करें, हालाँकि मुझे तृतीय-पक्ष या ओपन-सोर्स लाइब्रेरी का उपयोग करने से बचने की आवश्यकता है। विनिर्देश कारणों से, मुझे मूल C # ( या C ++ \ CLI ) का उपयोग करके इसे बनाने में सक्षम होना चाहिए ।


1
इसे अलग-अलग उपयोग / भार के तहत जोड़ने / हटाने / देखने के प्रदर्शन को मापने के लिए केवल और घंटे या दो का उपयोग करना चाहिए। मेरा मानना ​​है कि VS2010 आपके लिए प्रदर्शन परीक्षण कंकाल भी प्रदान करता है। यहां कोई भी कुछ भी नहीं कहता है, जो कोड आप लिखेंगे, उस पर आपका नाम होगा, सीधे या मेटाडेटा में।
जॉब

जवाबों:


8

इंगित करने वाली एक बात यह है कि डिक्शनरी अपने आप में ऑब्जेक्ट को होल्ड नहीं करने वाली है (जिसमें एक बड़ा मेमोरी फुटप्रिंट हो सकता है) लेकिन ऑब्जेक्ट का केवल एक संदर्भ होता है, ताकि ऑब्जेक्ट्स जटिल होने पर इसका डिक्शनरी साइज पर कोई प्रभाव न पड़े।

मैंने एक शब्दकोश में कई हजार वस्तुओं को एक साथ एक मेमोरी में एकत्र किया है और यह मुद्दा डिक्शनरी का आकार नहीं है, बल्कि वस्तुओं का आकार स्मृति में है। इन मामलों में शब्दकोश में शामिल मेमोरी का एक छोटा हिस्सा था।

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

यह ऑब्जेक्ट और मेमोरी साइज के बारे में एक उपयोगी स्टैक ओवरफ्लो प्रश्न है


2

प्रैक्टिकल की सीमाएँ उस मशीन के सापेक्ष हो सकती हैं जिस पर आपका सॉफ़्टवेयर चल रहा है और साथ ही इन डेटा संरचनाओं के भीतर आपके द्वारा वास्तव में कितनी वस्तुओं को रखने की योजना है। जैसा कि उल्लिखित है, int.MaxValue एक बड़ी संख्या है, लेकिन क्या 2 बिलियन आइटम एक व्यावहारिक सीमा के बराबर है? स्मृति में कई वस्तुओं को संग्रहीत करना बहुत व्यावहारिक नहीं है।


0

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


-1

मैंने हाल ही में जीथब प्रोजेक्ट हैश-टेबल-शूटआउट (यहां: https://github.com/jimbelton/hash-table-shootout ) को अपडेट किया है । मानक gcc के अनियंत्रित नक्शे में 40M ऑब्जेक्ट्स को स्टोर करने के लिए लगभग 1.8 GB ओवरहेड है। यह मुझे बहुत बुरा लगता है, लेकिन यहां तक ​​कि सबसे अच्छा प्रदर्शन करने वाला मेमोरी वार, Google sparse_hash_map, 600 Mbytes लेता है, और आप इसका उपयोग करने के लिए एक प्रदर्शन दंड का भुगतान करते हैं। यदि आप गति चाहते हैं, तो शामिल किए गए एल्गोरिदम में, ग्लिब GHashTable सबसे तेज़ है, और इसमें मेमोरी मेमोरी (लगभग 1.3 गीबेट्स ओवरहेड) अच्छी है। बेंचमार्क परिणाम यहां पोस्ट किए गए हैं: https://jimbelton.wordpress.com/2015/07/01/hash-table-shootout-on-github/

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.