मुझे एक समस्या है जहां एक जोड़े 3 आयामी सरणी बड़ी मात्रा में स्मृति आवंटित करती हैं और कार्यक्रम को कभी-कभी उन्हें बड़े/छोटे वाले लोगों के साथ बदलने की आवश्यकता होती है और आउटऑफमेमरी अपवाद फेंकता है।एरे के फोर्स कचरा संग्रह, सी #
उदाहरण: 5 आवंटित 96 एमबी सरणी (200x200x200, प्रत्येक प्रविष्टि में डेटा के 12 बाइट) हैं और कार्यक्रम को उन्हें 210x210x210 (111MB) के साथ बदलने की आवश्यकता है। यह इस तरह से करता है:
array1 = new Vector3[210,210,210];
जहां array1-array5 पहले इस्तेमाल किए गए समान फ़ील्ड हैं। इसे पुरानी सरणी को कचरे के संग्रह के लिए उम्मीदवारों के रूप में सेट करना चाहिए, लेकिन प्रतीत होता है कि जीसी जल्दी से पर्याप्त कार्य नहीं करता है और नए लोगों को आवंटित करने से पहले आवंटित पुराने सरणी छोड़ देता है - जो ओओएम का कारण बनता है - जबकि यदि वे नए आवंटन से पहले मुक्त हो जाते हैं तो अंतरिक्ष होना चाहिए पर्याप्त।
क्या मैं के लिए देख रहा हूँ इस तरह कुछ करने के लिए एक तरीका है:
GC.Collect(array1) // this would set the reference to null and free the memory
array1 = new Vector3[210,210,210];
मुझे यकीन है कि नहीं कर रहा हूँ अगर एक पूर्ण कचरा collecion एक अच्छा विचार होगा कि कोड के बाद से हो सकता है (कुछ स्थितियों में) काफी बार निष्पादित करने की आवश्यकता है।
क्या ऐसा करने का कोई उचित तरीका है?
यह वास्तव में अजीब लगता है कि इससे ओओएम अपवाद होगा। क्या आपके पास कुछ नमूना कोड है जो समस्या का प्रदर्शन करता है? – aquinas
यह एक बड़े पैमाने पर (अभी भी अप्रकाशित) कार्यक्रम का हिस्सा है और दुर्भाग्य से मैं केवल वास्तविक कोड के छोटे स्निपेट पोस्ट कर सकता हूं, जो कि संकलन योग्य होने के लिए पर्याप्त नहीं है। –
आपकी समस्या मेमोरी प्रबंधन नहीं है, लेकिन आप बहुत बड़े सरणी का उपयोग कर रहे हैं। आपको लगता है कि आपको उन बड़े सरणीओं को पहली जगह क्यों चाहिए? आप उनके लिए क्या उपयोग कर रहे हैं? – Guffa