कई SO उत्तरों और this widely cited blog post के अनुसार, 'किसी भी CPU' के लिए बनाया गया एक .NET 4.5 एप्लिकेशन '32-बिट' विकल्प के साथ चयनित 32-बिट और 32-बिट सिस्टम दोनों पर 32-बिट प्रक्रिया के रूप में चलाया जाएगा (.NET 4.0 और इससे पहले के विपरीत)। दूसरे शब्दों में, x86 और AnyCPU 'पसंदीदा 32-बिट' के साथ चयनित समकक्ष हैं (यह अनदेखा कर रहा है कि यह एआरएम पर चल सकता है या नहीं)।'कोई भी CPU (32-बिट पसंद करते हैं)' मुझे x86 से .NET 4.5 के तहत अधिक मेमोरी आवंटित करने की अनुमति क्यों देता है?
हालांकि, मेरे परीक्षणों से पता चला है कि 64-बिट सिस्टम पर 'AnyCPU 32-बिट' पसंद करता है (जिसे मैं 32-बिट चलाता हूं) x86 एक से अधिक स्मृति आवंटित कर सकता है। मैंने एक .NET 4.5 सी # कंसोल ऐप लिखा है जो एक लूप में 10 एमबी बाइट एरे आवंटित करता है (कोर्स के संदर्भों को रखते हुए) जब तक कि यह आउटऑफमेमरी अपवाद को हिट नहीं करता है, और इसे 64-बिट सिस्टम पर बहुत सी रैम के साथ चलाया जाता है। जब x86 के रूप में बनाया गया यह लगभग 1.2 जीबी आवंटित होता है। 'सीपीयू (32-बिट पसंद करते हैं)' के रूप में बनाया गया एक ही कोड 1.5 जीबी तक पहुंच जाता है।
अंतर क्यों?
मान लें कि आप 10 एमबी ऑब्जेक्ट्स को किसी सरणी में सूचीबद्ध कर रहे हैं या स्वयं सूचीबद्ध हैं, तो आप * * * सरणी उड़ रहे हैं। http://bhrnjica.net/2012/07/22/with-net-4-5-10-years-memory-limit-of-2-gb-is-over/ सेट 'gcAllowVeryLargeObjects' और कोशिश करें। मेरा अनुमान है कि आप अपनी आंतरिक सरणी का आकार बदलकर 'सूची' को ट्रिगर करते हैं और "ओओएम" –
@ChrisMarisic में बदलते हैं, मैं प्रत्येक पुनरावृत्ति में एक नया 10 एमबी बाइट सरणी बना रहा हूं, और एक सूची में * संदर्भ * जोड़ रहा हूं (उन्हें रोकने के लिए कचरा इकट्ठा किया जा रहा है)। तो सूची स्वयं छोटा है, केवल कुछ सौ संदर्भ। –