2015-06-30 10 views
6

से बहुत दूर है मेरे पास List<Matrix4> है, जहां Matrix4 एक संरचना है जिसमें 16 फ्लोट हैं, इसलिए यह 16 * 4 बाइट्स = 64 बाइट्स का उपयोग करता है।सी # सूची <T> मेमोरी अपवाद से बाहर है लेकिन 2 जीबी सीमा

जब मैं सूची में आइटम जोड़ना शुरू करता हूं तो यह 1 मिलियन लाइन पार करते समय आउट ऑफ़ मेमोरी अपवाद फेंकता है।

मुझे पता है कि .NET ऑब्जेक्ट प्रति 2GB की सीमा होती है, लेकिन जब तक मैं पूरी तरह से मेरे मन की बाहर हूँ:

1.000.000 * 64 बाइट्स = ~ 61mb

कौन सा भी पास नहीं है सीमा तक।

जब मैं सूची प्रबंधक के अनुसार सूची को पॉप्युलेट करना शुरू करता हूं, तो मेरा एप्लिकेशन 896 एमबी का उपयोग कर रहा है और जब तक मैं अपवाद तक पहुंचता हूं तो यह 1028 एमबी का उपयोग कर रहा है।

कंप्यूटर में 8 जीबी की भौतिक मेमोरी है लेकिन यह केवल 6 जीबी का उपयोग कर रही है।

कोई संकेत क्यों हो रहा है?

--- अद्यतन ----

64 के लिए मंच लक्ष्य को बदलने से एक अलग परीक्षण परियोजना पर समस्या हल हो जाती। दुर्भाग्य से मूल परियोजना x64 नहीं हो सकती है क्योंकि संदर्भ x86 DLLs करते हैं जो x64 पर काम नहीं करते हैं। लेकिन यह एक और समस्या है।

मैंने इसे x64 में बदलने पर विचार नहीं किया क्योंकि यह स्मृति सीमा से बहुत दूर था, लेकिन मुझे लगता है कि हंस पासेंट 122 एमबी पर 1.3 जीबी सीमा से बहुत करीब था। आप सभी को धन्यवाद।

+5

यह नहीं कि इसका उत्तर है, लेकिन आप इस तरह .NET स्मृति आवंटन की गणना नहीं कर सकते हैं। –

+1

आपको मेमोरी उपयोग को प्रोफाइल करने के लिए विजुअल स्टूडियो में टूलींग का उपयोग करना चाहिए। https://msdn.microsoft.com/en-us/library/dn342825.aspx –

+0

मुझे नहीं लगता कि यह भी जवाब है। लेकिन, .NET में प्रत्येक ऑब्जेक्ट में जानकारी के साथ शीर्षलेख है। 32 बिट ऐप में हेडर 8 बिट्स लम्बाई है, 64 बिट ऐप में हेडर 16bytes लंबाई है। तो, प्रत्येक फ्लोट 12bytes लंबाई (32 बिट ऐप में) का उपभोग करता है। अधिक कोड देखने के बिना असंभव बात यह है कि समस्या क्या है। –

उत्तर

11

बड़े ऑब्जेक्ट हीप (LOH) पर बड़ी संरचनाएं की जाती हैं और यह विखंडन के अधीन होती है।

तो जब आपके पास शायद पर्याप्त खाली मेमोरी है, तो आपके पास स्मृति के 1 बड़े ब्लॉक को छोड़ दिया नहीं जा सकता है।

आपकी संख्या (1 एम x 64) उनके द्वारा पर्याप्त नहीं हैं, केवल उस पर चलने वाले पर्याप्त अन्य आवंटन के साथ इस मुद्दे की व्याख्या होगी। आप इस विशेष मुद्दे को हल करने का प्रयास कर सकते हैं, लेकिन शायद यह वह बिंदु है जहां एक बड़ी समस्या दिखाई दे रही है।

सामान्य रूप से, कार्य समस्याएं निदान समस्याओं का निदान करने का सही टूल नहीं है। क्या हो रहा है यह जानने के लिए आपको एक मेमोरी प्रोफाइलर चाहिए।

यह आपके प्लेटफ़ॉर्म के संस्करण और 32 या 64 बिट्स पर निर्भर करता है या नहीं।

+0

यहां बड़ी संरचना क्या होगी? LOH पर होने के लिए 'Matrix4' बहुत छोटा नहीं है? –

+1

@Asad - हाँ, लेकिन वे वैल्यू प्रकार हैं इसलिए सूची <> Nx64 बाइट्स की सरणी रखेगी। एक बड़े एन –

+0

आह के साथ, इसलिए एलओएच में भाग में भी एक बड़ी वस्तु आवंटित की जा सकती है (और इसलिए विखंडन के मुद्दों में परिणाम)? –

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