2010-11-29 15 views
15

में जोड़ना मेरे पास एक साधारण एप्लिकेशन है जो हैशसेट <string> पर लगभग 7 मिलियन छोटे तार जोड़ता है। कभी-कभी मुझे हैशसेट के कॉल के दौरान अपवाद मिलता है। जोड़ें(): सिस्टम। चयन। जेनेरिक। हैशसेट '1। इन्फ्रारेज़ कैपेसिटी(): इंडेक्स सरणी की सीमाओं के बाहर था।इंडेक्सऑटऑफेंजेंज अपवाद जब हैशसेट <T>

यह एक अड़चन समस्या है और स्मृति से संबंधित प्रतीत होता है, लेकिन यह 16 जीबी के साथ Win2k8 R2 सर्वर पर है, और अधिक नहीं चल रहा है, उस भौतिक स्मृति में से अधिकांश उपलब्ध है। कोई विचार?

+5

क्या आप बहु-थ्रेडेड जोड़ रहे हैं? – herzmeister

+0

मैंने अभी एक प्रोजेक्ट बनाया है जो समांतरता का उपयोग करते हुए 4 कोर पीसी पर int.MaxValue Guids जोड़ता है, और यह असफल नहीं हो रहा है। –

+0

yup, वह समस्या थी। मुझे पता होना चाहिए। धन्यवाद herzmeister – dcrobbins

उत्तर

35

HashSet<T> थ्रेड-सुरक्षित नहीं है। विशेष रूप से जब एक बहु थ्रेडेड परिदृश्य में आइटम जोड़ते हैं और आंतरिक क्षमता में वृद्धि की जाती है, तो चीजें सिंक से बाहर हो सकती हैं।

+3

+1 इंडेक्सऑटऑफेंजेंज एक्सेप्शन एक निश्चित संकेतक है कि संग्रह पर एक एड ऑपरेशन से फेंकने पर रनटाइम थ्रेडिंग समस्याएं होती हैं। –

5

HashSet<T> पर उदाहरण विधियां थ्रेड-सुरक्षित नहीं हैं। विशेष रूप से, जब आप एक तत्व जोड़ने का प्रयास करते हैं जो सेट को मौजूदा सरणी की सीमाओं को एक समय में एक से अधिक थ्रेड में पार करने का कारण बनता है, तो इंस्टेंस वैरिएबल सेट के आकार और अंतिम अनुक्रमणिका में ट्रैक रखने के लिए उपयोग किया जाता है सेट दोनों धागे में अद्यतन किया जा सकता है। विशेष रूप से, यदि अंतिम थ्रेड समाप्त होने से पहले अंतिम सूचकांक मान को दूसरे थ्रेड (एक बड़े मान के साथ) अद्यतन किया जाता है, तो गंतव्य सरणी की प्रतिलिपि समाप्त होने से पहले, यह उस स्थानीय सरणी के तत्व को एक्सेस करने का प्रयास कर सकता है जो मौजूद नहीं है क्योंकि स्थानीय सरणी दूसरे थ्रेड द्वारा आवंटित किए गए आधे तत्वों को केवल आधा रखने के लिए आवंटित किया गया था।

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