.NET मेमोरी आउट से बाहर - 1.3GB का उपयोग किया गया है लेकिन 16GB स्थापित है


91

मैं अपने c # एप्लिकेशन में एक मेमोरी मेमोरी अपवाद प्राप्त कर रहा हूं जब एप्लिकेशन का मेमोरी उपयोग लगभग 1.3GB से अधिक हो जाता है।

स्मृति की 3 जी बी के साथ 32-बिट मशीन पर मुझे यही समस्या थी और यह तब समझ में आया, लेकिन अब मैंने हार्डवेयर को 64-बिट मशीन के साथ उच्च अंत मदरबोर्ड और रैम के साथ अपग्रेड किया लेकिन आउट ऑफ मेमोरी 1.3GB के बाद भी अपवाद होता है!

मुझे पता है कि 2GB से अधिक एक भी ऑब्जेक्ट नहीं हैं और 1.3 वैसे भी 2GB से कम है, इसलिए किसी ऑब्जेक्ट पर निर्मित MS 2GB की सीमा समस्या की संभावना नहीं है ...

ऐसा लगता है कि जब कोई ऐप किसी निश्चित मेमोरी उपयोग सीमा तक पहुंचता है, तो किसी तरह का विंडोज़ किल-स्विच होता है ... फिर यह कॉन्फ़िगर करने का एक तरीका होना चाहिए कि क्या यह रजिस्ट्री में है?

किसी भी प्रकार की सहायता सराहनीय होगी!


9
क्या आपका ओएस 64 बिट भी है?
फर्ज

9
यहां तक ​​कि अगर आपका OS 64bit है, तो सुनिश्चित करें कि आपकी प्रक्रिया भी 64bit (या AnyCPU) है
Knowleech

जवाबों:


90

जब तक आप एक ही लक्ष्य वास्तुकला को संकलित नहीं करते तब तक कोई अंतर नहीं है । मुझे लगता है कि आप 32दोनों मामलों में बिट आर्किटेक्चर के लिए संकलन कर रहे हैं ।

यह ध्यान देने योग्य है कि OutOfMemoryExceptionअगर आप आर्किटेक्चर और बिट दोनों पर सीएलआर (कहते हैं ) 2GBमें एक संग्रह द्वारा आवंटित मेमोरी प्राप्त करते हैं , तो भी उठाया जा सकता है ।List<T>3264

पर स्मृति अच्छाई से लाभ प्राप्त करने में सक्षम होने के 64बिट आर्किटेक्चर, आप के लिए है संकलन को निशाना बनाने के लिए अपने कोड 64बिट आर्किटेक्चर। उसके बाद, स्वाभाविक रूप से, आपका बाइनरी केवल64 बिट पर चलेगा , लेकिन रैम में अधिक स्थान उपलब्ध होने की संभावना से लाभ होगा।


8
AnyCPU के बारे में क्या?
dtb

1
हां, AnyCPU एक विकल्प भी है, जहां आपके पास JIT वास्तुकला पर निर्भर कोड का विकल्प है। लेकिन विशिष्ट आर्किटेक्चर को लक्षित करना उन मामलों में भी लाभकारी हो सकता है, जब आपके पास गैर प्रबंधित (कहना) संसाधन हों। मुझे पता नहीं है कि ओपी की वास्तुकला क्या है।
तिगरान

4
मुझे पता था कि :) - धन्यवाद टाइगरान, मैंने x64 में समाधान का पुनर्निर्माण किया और अपवाद चला गया।
पेसमैन

63

जैसा कि पहले ही उल्लेख किया गया है, x64 में ऐप को संकलित करना आपको अधिक उपलब्ध स्मृति प्रदान करता है।

लेकिन अगर किसी को x86 में एक ऐप बनाना चाहिए, तो मेमोरी सीमा को 1,2GB से बढ़ाकर 4GB करने का एक तरीका है (जो कि 32 बिट प्रक्रियाओं के लिए वास्तविक सीमा है):

Visual Studio स्थापना निर्देशिका के VC / बिन फ़ोल्डर में, एक editbin.exeफ़ाइल होनी चाहिए । इसलिए मेरी डिफ़ॉल्ट स्थापना में मैं इसे ढूंढता हूं

C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\bin\editbin.exe

कार्यक्रम को काम करने के लिए, शायद आपको vcvars32.batपहले उसी निर्देशिका में निष्पादित करना होगा । फिर एक

editbin /LARGEADDRESSAWARE <your compiled exe file>

आपके प्रोग्राम को 4GB RAM का उपयोग करने के लिए पर्याप्त है। <your compiled exe file>निर्वासन है, जो आपके प्रोजेक्ट को संकलित करते समय वी.एस.

यदि आप हर बार अपनी परियोजना को संकलित करते हुए इस व्यवहार को स्वचालित करना चाहते हैं, तो निष्पादित परियोजना के लिए निम्नलिखित पोस्ट-बिल्ड इवेंट का उपयोग करें:

if exist "$(DevEnvDir)..\tools\vsvars32.bat" (
   call "$(DevEnvDir)..\tools\vsvars32.bat"
   editbin /largeaddressaware "$(TargetPath)"
)

सिडेनोट: devenv.exeविजुअल स्टूडियो को 1.2GB के बजाय 4GB रैम का उपयोग करने की अनुमति दी जा सकती है (लेकिन पहले बैकअप पुराने devenv.exe)।


बहुत बहुत धन्यवाद। यह मेरे लिए काम करता है। लेकिन क्या हमारे पास मेमोरी की सीमा को बढ़ाकर 4GB करने के बाद कोई पहचान की गई समस्या है।
मवरिक

28

यह ध्यान देने योग्य है कि 'किसी भी सीपीयू' संकलन के लिए डिफ़ॉल्ट अब 'पसंदीदा 32 बिट' चेक बॉक्स की जाँच करता है। AnyCPU के लिए सेट किया जा रहा है, 64 जीबी ओएस पर 16 जीबी रैम के साथ अभी भी 2 जीबी पर मेमोरी अपवाद से बाहर निकल सकता है अगर यह जांच की जाती है।

Prefer32BitCheckBox


2
इसने मेरी स्मृति मुद्दों को पूरी तरह से हल किया और हमें एक टन निराशा से बचाया
RSSM

2

ऐसा लगता है कि आपके पास 64 बिट आर्क है, ठीक है - लेकिन .NET रनटाइम का 32 बिट संस्करण और / या विंडोज का 32 बिट संस्करण है।

और जैसे, आपकी प्रक्रिया के लिए उपलब्ध पता स्थान अभी भी वही है, यह आपके पिछले सेटअप से नहीं बदला है।

64bit OS और 64bit .NET संस्करण दोनों में अपग्रेड करें;)


1

क्या आपका आवेदन 64 या 32 बिट प्रक्रिया के रूप में चल रहा है? आप इसे कार्य प्रबंधक में देख सकते हैं।

यह हो सकता है, यह 32 बिट के रूप में चल रहा है, भले ही पूरी प्रणाली 64 बिट पर चल रही हो।

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


0

यदि आपके पास 32-बिट विंडोज है, तो यह विधि सेटिंग्स का पालन किए बिना काम नहीं कर रही है।

  1. शीघ्र cmd.exe चलाएँ (महत्वपूर्ण: व्यवस्थापक के रूप में चलाएँ)
  2. bcdedit.exe टाइप करें और चलाएँ
  3. "बढ़ाने" params को देखो और उसके बाद कोई कथन नहीं है
  4. bcdedit / setususerva 3072
  5. और फिर से चरण 2 और चेक परमेस

हमने इस सेटिंग्स को जोड़ा और यह ब्लॉक शुरू हो गया।

if exist "$(DevEnvDir)..\tools\vsvars32.bat" (
   call "$(DevEnvDir)..\tools\vsvars32.bat"
   editbin /largeaddressaware "$(TargetPath)"
)

अधिक जानकारी - कमांड increaseuserva: https://docs.microsoft.com/en-us/windows-hardware/drivers/devtest/bcdedit--set

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.