2012-10-23 13 views
8
var a = new double[7000,7000]; 

FillValue(a,3); 

ऐसा लगता है कि नेट वास्तव में पहली पंक्ति को निष्पादित करने के बाद a पर किसी भी स्मृति को आवंटित नहीं करता है। केवल FillValue कॉल चल रहा है, जबकि यह धीरे-धीरे स्मृति खा रहा है। (जो लगभग 400 एमबी है)2 डी सरणी प्रारंभ करते समय .net स्मृति आवंटित क्यों नहीं करता है?

क्या कोई मुझे इसके बारे में अधिक जानकारी प्रदान कर सकता है? मैंने सोचा कि a डिफ़ॉल्ट प्रारंभिकरण के बाद 0 से भरा हुआ है, यह कोई स्मृति नहीं ले सकता है?

+4

आप कैसे माप रहे हैं कि यह स्मृति आवंटित करता है या नहीं? –

+0

@ सेठ कार्नेगी दुख की बात है, मैंने बहुत क्रूर तरीके से उपयोग किया ... बस विंडोज़ टास्क मैनेजर को देखो .. और ब्रेक पॉइंट सेट अप करें, लूप में कुछ बार चलाएं। यह प्रति 'fill' 400 एमबी मेमोरी है जो स्पॉट करना आसान है। – colinfang

+1

यह ऑपरेटिंग सिस्टम की वजह से भी हो सकता है। "मेमोरी संयोजन" देखें http://blogs.msdn.com/b/b8/archive/2011/10/07/reducing-runtime-memory-in-windows-8.aspx –

उत्तर

9

विंडोज़ में 'स्मृति आवंटित करने' के दो तरीके हैं: 'रिजर्व' और स्मृति को 'प्रतिबद्ध' करने के लिए।

कार्य प्रबंधक केवल "भौतिक स्मृति उपयोग इतिहास" दिखाता है; जब आप एक सरणी आवंटित करते हैं तो .NET VM स्पष्ट रूप से केवल आरक्षित स्मृति का उपयोग करता है, और फिर वापस चला जाता है और उपयोग किए जाने वाले हिस्सों को करता है।

एमएसडीएन के मुताबिक, यह वास्तव में इसे लेने के बिना स्मृति को आरक्षित कर सकता है, जो स्मृति की वास्तविक भौतिक भंडारण आवंटित किए बिना प्रक्रिया की वर्चुअल एड्रेस स्पेस की एक श्रृंखला को सुरक्षित रखता है या " डिस्क पर पेजिंग फ़ाइल "। यही कारण है कि टास्क मैनेजर इसे नहीं दिखाता है।

आप एमएसडीएन पर VirtualAlloc पृष्ठ पर इसके बारे में और अधिक पढ़ सकते हैं।

हालांकि यह एक कार्यान्वयन विवरण है, इसलिए आपको इसे या किसी भी चीज़ पर भरोसा नहीं करना चाहिए। उदाहरण के लिए, मोनो वीएम अलग-अलग व्यवहार करने की संभावना है।

+1

मैं सोच रहा हूं कि अगर हम स्पैर मैट्रिक्स मैनिपुलेशन पर काम करते हैं तो हम इसका लाभ उठा सकते हैं। – colinfang

7

वास्तव में यह स्मृति आवंटित करता है के रूप में आप देख सकते हैं:

http://ideone.com/Cd4BR1

Console.WriteLine("Memory before: {0}",GC.GetTotalMemory(true)); 
var a = new double[5000,5000]; 
Console.WriteLine("Memory after: {0}",GC.GetTotalMemory(true)); 

Memory before: 118784 
Memory after: 200224768 

GC.GetTotalMemory Method

(ideone पर एक OutOfMemoryException को रोकने के लिए सरणी के आकार को कम करने के लिए आवश्यक)

वर्तमान में आवंटित किए जाने वाले बाइट्स की संख्या को पुनर्प्राप्त करता है।

+1

एफडब्ल्यूआईडब्ल्यू ideone मोनो का उपयोग करता है। –

+3

महान उदाहरण, thx, आज एक नई विधि सीखा :) – colinfang

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