दिलचस्प पोस्ट
फ्लास्क अनुरोध में प्राप्त आंकड़े कैसे प्राप्त करें जावास्क्रिप्ट का उपयोग करते हुए पोस्ट के अनुरोध मापदंडों को कैसे पढ़ें कोडन त्रुटि: समाप्त प्रोफ़ाइल को हटाने के बाद प्रोविजनिंग प्रोफ़ाइल नहीं मिल सकती लिनक्सः एसएसएच क्लाइंट को बंद करने के बाद पृष्ठभूमि प्रोसेस को रोका जा रहा है PHP: स्ट्रिंग में सभी गैर प्रिंट करने योग्य वर्ण कैसे निकालें? NSString गणना को बनाए रखने स्विफ्ट भाषा में विस्मयादिबोधक चिह्न का क्या अर्थ है? कॉलम के नाम लाने के लिए ओरेकल क्वेरी कैसे अजगर datetime.time को डेल्टा जोड़ने के लिए? आमंत्रण कॉल में अनाम विधि दिन डेटा के साथ एक जेफ्री चार्ट टाइमशरीज श्रृंखला को सप्ताह या महीना डेटा में परिवर्तित करना? OpenSSL के लिए grep या .jar फ़ाइलों को कैसे खोजें? मैं एक छवि में EXIF ​​डेटा कैसे जोड़ूं? जेडीबीसी का उपयोग करके संग्रहीत कार्यप्रणाली से ओरेकल तालिका प्रकार लाएं एक्सएचटीएमएल स्व-निहित टैग को छोड़कर RegEx मैच खुली टैग

'सिस्टम.ऑटऑफमोमररी एक्सपेशमेंट' तब फेंका गया जब बहुत मेमोरी फ्री हो

यह मेरा कोड है:

int size = 100000000; double sizeInMegabytes = (size * 8.0) / 1024.0 / 1024.0; //762 mb double[] randomNumbers = new double[size]; 

अपवाद: 'System.OutOfMemoryException' प्रकार की अपवाद फेंक दिया गया था।

मेरे पास इस मशीन पर 4 जीबी मेमोरी है, जब मैं इसे चालू कर रहा हूं, तो 2.5 जीबी निशुल्क है , 762 एमबी की 100000000 यादृच्छिक संख्या को संभालने के लिए पीसी पर स्पष्ट रूप से पर्याप्त जगह है। मुझे संभवतः उपलब्ध स्मृति उपलब्ध के रूप में कई यादृच्छिक संख्या को संग्रहित करने की आवश्यकता है। जब मैं उत्पादन पर जाता हूं, तो बॉक्स पर 12 जीबी होगी और मैं इसका इस्तेमाल करना चाहता हूं।

क्या सीएलआर मुझे शुरू करने के लिए डिफ़ॉल्ट अधिकतम मेमोरी पर रोकता है? और मैं और अधिक कैसे अनुरोध करूं?

अद्यतन करें

मुझे लगता है कि इसे छोटे हिस्से में बांट दिया जाए और मेरी याददाश्त आवश्यकताओं में बढ़ोतरी में मदद मिलेगी यदि यह समस्या स्मृति विखंडन के कारण हो, लेकिन यह नहीं है कि मैं 256MB के कुल आरे-लिस्ट आकार को प्राप्त नहीं कर सकता, भले ही मैं tweaking blockSize क्या करूँ

 private static IRandomGenerator rnd = new MersenneTwister(); private static IDistribution dist = new DiscreteNormalDistribution(1048576); private static List<double> ndRandomNumbers = new List<double>(); private static void AddNDRandomNumbers(int numberOfRandomNumbers) { for (int i = 0; i < numberOfRandomNumbers; i++) { ndRandomNumbers.Add(dist.ICDF(rnd.nextUniform())); } } 

मेरी मुख्य विधि से:

 int blockSize = 1000000; while (true) { try { AddNDRandomNumbers(blockSize); } catch (System.OutOfMemoryException ex) { break; } } double arrayTotalSizeInMegabytes = (ndRandomNumbers.Count * 8.0) / 1024.0 / 1024.0; 

वेब के समाधान से एकत्रित समाधान "'सिस्टम.ऑटऑफमोमररी एक्सपेशमेंट' तब फेंका गया जब बहुत मेमोरी फ्री हो"

आप इसे पढ़ना चाह सकते हैं: " " मेमोरी से बाहर "एरिक लिपरट द्वारा" भौतिक मेमोरी को नहीं देखें "

संक्षेप में, और बहुत सरल, "स्मृति से बाहर" का मतलब वास्तव में नहीं है कि उपलब्ध स्मृति की मात्रा बहुत छोटी है सबसे आम कारण यह है कि वर्तमान पता स्थान के भीतर, स्मृति का कोई भी हिस्सा नहीं है जो वांछित आवंटन को पूरा करने के लिए काफी बड़ा है। यदि आपके पास 100 ब्लॉकों, प्रत्येक 4 एमबी बड़ा है, जो आपको 5 एमबी ब्लॉक की आवश्यकता होती है तो आपकी मदद नहीं कर रहा है।

प्रमुख बिंदु:

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

आपके पास 762MB आवंटित करने के लिए मेमोरी का निरंतर ब्लॉक नहीं है, आपकी स्मृति खंडित है और ऑलोकेटर को आवश्यक स्मृति आवंटित करने के लिए एक बड़ा पर्याप्त छेद नहीं मिल सकता है।

  1. आप / 3 जीबी के साथ काम करने की कोशिश कर सकते हैं (जैसा कि अन्य लोगों ने सुझाया था)
  2. या 64 बिट ओएस पर स्विच करें
  3. या एल्गोरिथ्म को संशोधित करें ताकि उसे मेमोरी का एक बड़ा हिस्सा नहीं चाहिए। शायद स्मृति के कुछ छोटे (अपेक्षाकृत) भाग आवंटित करें।

जांचें कि आप 64-बिट प्रक्रिया बना रहे हैं, और 32-बिट एक नहीं, जो कि विज़ुअल स्टूडियो का डिफ़ॉल्ट संकलन मोड है। ऐसा करने के लिए, अपने प्रोजेक्ट पर राइट क्लिक करें, गुण -> बिल्ड -> प्लेटफ़ॉर्म लक्ष्य: x64 32-बिट प्रक्रिया के रूप में, 32-बिट में संकलित विजुअल स्टूडियो अनुप्रयोगों में वर्चुअल स्मृति सीमा 2GB है।

64-बिट प्रक्रियाओं में यह सीमा नहीं है, क्योंकि वे 64-बिट पॉइंटर्स का उपयोग करते हैं, इसलिए उनके सैद्धांतिक अधिकतम पता स्थान (उनके वर्चुअल मेमोरी का आकार) 16 एक्सबाइट्स (2 ^ 64) है। वास्तविकता में, विंडोज़ x64 8TB की प्रक्रियाओं की आभासी स्मृति को सीमित करता है स्मृति सीमा समस्या का हल 64-बिट में संकलित करने के लिए है।

हालांकि, दृश्य स्टूडियो में वस्तु का आकार अभी भी 2GB तक सीमित है, डिफ़ॉल्ट रूप से आप कई सरणी बनाने में सक्षम होंगे जिनके आकार का आकार 2 जीबी से अधिक होगा, लेकिन आप डिफ़ॉल्ट रूप से 2 जीबी से बड़ा एरेज़ नहीं बना सकते हैं। उम्मीद है, अगर आप अब भी 2 जीबी से बड़ा एरेज़ बनाना चाहते हैं, तो आप इसे ऐप.कॉन्फिग फ़ाइल में निम्न कोड जोड़कर कर सकते हैं:

 <configuration> <runtime> <gcAllowVeryLargeObjects enabled="true" /> </runtime> </configuration> 

जैसा कि आपने शायद सोचा, समस्या यह है कि आप मेमोरी के एक बड़े खंड को आवंटित करने की कोशिश कर रहे हैं, जो स्मृति विखंडन के कारण काम नहीं करता है। अगर आप जो कर रहे हैं मैं करने की ज़रूरत है, तो मैं निम्न कार्य करेगा:

 int sizeA = 10000, sizeB = 10000; double sizeInMegabytes = (sizeA * sizeB * 8.0) / 1024.0 / 1024.0; //762 mb double[][] randomNumbers = new double[sizeA][]; for (int i = 0; i < randomNumbers.Length; i++) { randomNumbers[i] = new double[sizeB]; } 

फिर, एक विशिष्ट सूचकांक प्राप्त करने के लिए आप randomNumbers[i / sizeB][i % sizeB] उपयोग करेंगे

एक अन्य विकल्प यदि आप हमेशा क्रम में मानों का उपयोग करते हैं, तो बीज निर्दिष्ट करने के लिए ओवरलोड किए गए कन्स्ट्रक्टर का उपयोग किया जा सकता है। इस तरह आपको अर्धहीन यादृच्छिक संख्या मिल जाएगी (जैसे DateTime.Now.TicksDateTime.Now.Ticks ) इसे किसी चर में संग्रहीत करते हैं, फिर जब भी आप सूची के माध्यम से जाना शुरू करते हैं तो आप मूल बीज का उपयोग करके एक नया यादृच्छिक उदाहरण बनाते हैं:

 private static int randSeed = (int)DateTime.Now.Ticks; //Must stay the same unless you want to get different random numbers. private static Random GetNewRandomIterator() { return new Random(randSeed); } 

यह ध्यान रखना महत्वपूर्ण है कि फ़्रेडरिक मेर्क के उत्तर से जुड़े ब्लॉग का पता चलता है कि यह मुद्दा आम तौर पर पता स्थान की कमी के कारण होता है, इसमें 2 जीबी सीएलआर ऑब्जेक्ट आकार की सीमा (जैसे कि ShuggyCoUk एक ही ब्लॉग पर), स्मृति विखंडन पर चमक, और पेज फ़ाइल आकार के प्रभाव का उल्लेख करने में विफल रहता है (और इसे CreateFileMapping फ़ंक्शन के उपयोग के साथ कैसे संबोधित किया जा सकता है )

2GB सीमा का अर्थ है कि randomNumbers 2GB से कम होनी चाहिए। चूंकि सरणियां कक्षाएं हैं और उनमें कुछ उपरि है, इसका मतलब है कि double की एक सरणी छोटी होगी तो 2 ^ 31। मुझे यकीन नहीं है कि 2 ^ 31 लंबाई कितना छोटा होगा, लेकिन एक .NET सरणी के ओवरहेड? इंगित करता है कि 12 – 16 बाइट्स

मेमोरी फ़्रेग्मेंटेशन एचडीडी विखंडन के समान है। आपके पास 2GB का पता स्थान हो सकता है, लेकिन जैसा कि आप वस्तुओं को बनाते हैं और नष्ट करते हैं, वहां मूल्यों के बीच अंतर होगा। यदि ये अंतर आपके बड़े ऑब्जेक्ट के लिए बहुत छोटा है, और अतिरिक्त स्थान का अनुरोध नहीं किया जा सकता है, तो आपको System.OutOfMemoryException मिलेगा। System.OutOfMemoryException । उदाहरण के लिए, यदि आप 2 मिलियन, 1024 बाइट ऑब्जेक्ट बनाते हैं, तो आप 1. 9 जीबी का उपयोग कर रहे हैं। यदि आप हर ऑब्जेक्ट को हटाते हैं जहां पता 3 का एक मल्टीपल नहीं है, तो आप .6 जीबी मेमोरी का प्रयोग करेंगे, लेकिन यह 2024 बाइट ओपन ब्लॉक्स के साथ एड्रेस स्पेस में फैलेगा। यदि आपको एक ऑब्जेक्ट बनाने की आवश्यकता है जो .2 जीबी आप ऐसा करने में सक्षम नहीं होंगे, क्योंकि इसमें एक ब्लॉक बड़ा नहीं है और इसमें अतिरिक्त स्थान प्राप्त नहीं किया जा सकता (32 बिट वातावरण संभालने)। इस समस्या का संभावित समाधान छोटी वस्तुओं का उपयोग करना, स्मृति में आपके द्वारा संग्रहीत डेटा की मात्रा को कम करने या स्मृति विखंडन को रोकने / रोकने के लिए स्मृति प्रबंधन एल्गोरिथम का उपयोग करना जैसी चीज़ें हैं। यह ध्यान दिया जाना चाहिए कि जब तक आप एक बड़ा प्रोग्राम विकसित नहीं कर रहे हैं जो बड़ी मात्रा में स्मृति का उपयोग करता है, यह कोई समस्या नहीं होगी। साथ ही, यह समस्या 64 बिट सिस्टम पर उठ सकती है क्योंकि खिड़कियां ज्यादातर पृष्ठ फ़ाइल आकार और सिस्टम पर रैम की मात्रा के द्वारा सीमित हैं।

चूंकि अधिकांश कार्यक्रम ओएस से काम करने की मेमोरी का अनुरोध करते हैं और एक फ़ाइल मैपिंग का अनुरोध नहीं करते हैं, वे सिस्टम की रैम और पेज फ़ाइल आकार द्वारा सीमित होंगे। जैसा कि ब्लॉग पर नेस्टोर सेंचेज (नेस्टोर सेंचेज) की टिप्पणी में बताया गया है, सी # जैसी प्रबंधित कोड के साथ आप रैम / पृष्ठ फ़ाइल सीमा और ऑपरेटिंग सिस्टम के पते की जगह पर फंस रहे हैं।


उस तरह से अब उम्मीद की जाती थी उम्मीद है कि यह किसी को मदद करता है मैंने इसे पोस्ट किया क्योंकि मैं सिस्टम में चला गया। System.OutOfMemoryException एक सिस्टम पर एक्स 64 प्रोग्राम चल रहा है, जबकि 24 जीबी रैम के साथ मेरी सरणी केवल 2 जीबी सामान रखती थी I

मैं / 3 जीबी विंडोज़ बूट विकल्प के बारे में सलाह दूंगा। सब कुछ के अलावा (यह बुरी तरह से व्यवहार किया गया आवेदन के लिए ऐसा करने के लिए अधिक है , और शायद यह आपकी समस्या को हल नहीं करेगा), यह बहुत अस्थिरता पैदा कर सकता है

इस विकल्प के साथ कई विंडोज़ ड्राइवरों का परीक्षण नहीं किया जाता है, इसलिए उनमें से कुछ मानते हैं कि उपयोगकर्ता-मोड पॉइंटर्स हमेशा पता स्थान के निचले 2 जीबी तक इंगित करते हैं। जिसका अर्थ है कि वे / 3 जीबी के साथ बुरी तरह टूट सकते हैं

हालांकि, विंडोज सामान्य रूप से एक 32-बिट प्रक्रिया को 2 जीबी पता स्थान पर सीमित करता है। लेकिन इसका मतलब यह नहीं है कि आपको 2 जीबी आवंटित करने की उम्मीद होनी चाहिए!

पता स्थान पहले से ही आवंटित डेटा के सभी प्रकार से भरी हुई है। स्टैक है, और सभी संसदें जो भरी हुई हैं, स्थैतिक चर और इसी तरह हैं। इसमें कोई गारंटी नहीं है कि कहीं भी 800 एमबी की असम्बद्ध स्मृति होगी

2 400 एमबी हिस्सेदारी आवंटित करना संभवतः बेहतर होगा। या 4 200MB हिस्सा छोटे आवंटन खंडित मेमोरी स्पेस में जगह खोजने के लिए बहुत आसान हैं I

वैसे भी, अगर आप इसे 12 जीबी मशीन में तैनात करने जा रहे हैं, तो आप इसे 64-बिट अनुप्रयोग के रूप में चलाने के लिए चाहेंगे, जिससे सभी समस्याओं का समाधान हो।

32 से 64 बिट में बदलने से मेरे लिए काम किया गया – अगर आप 64 बिट पीसी पर हैं और इसे बंदरगाह की आवश्यकता नहीं है तो कोशिश करें।

यदि आपको इस तरह के बड़े ढांचों की ज़रूरत है, तो शायद आप मेमोरी मैप किए गए फ़ाइलों का उपयोग कर सकते हैं। यह आलेख उपयोगी साबित हो सकता है: http://www.codeproject.com/KB/recipes/MemoryMappedGenericArray.aspx

एलपी, देजन

32 बिट विंडो में एक 2 जीबी प्रोसेस मेमोरी सीमा है। / 3 जीबी बूट विकल्प का कहना है कि यह 3 जीबी ओएस कर्नेल उपयोग के लिए सिर्फ 1 जीबी शेष है। वास्तविक रूप से यदि आप 2 जीबी से अधिक परेशानी के बिना उपयोग करना चाहते हैं तो एक 64 बिट ओएस की आवश्यकता है। यह भी समस्या पर काबू पा रहा है, हालांकि आपके पास 4 जीबी की भौतिक रैम हो सकती है, वीडियो कार्ड के लिए रिकॉर्डेड एड्रेस स्पेस उस मेमोरी का एक बड़ा चक बना सकता है – आमतौर पर 500 एमबी के आसपास।

एक विशाल सरणी आवंटित करने के बजाय, क्या आप एक इटरेटर का उपयोग करने की कोशिश कर सकते हैं? ये देरी-क्रियान्वित हैं, जिसका अर्थ है मान केवल उत्पन्न होते हैं, जैसा कि वे एक उपर्युक्त बयान में अनुरोध करते हैं; आपको इस तरह से स्मृति से बाहर नहीं होना चाहिए:

 private static IEnumerable<double> MakeRandomNumbers(int numberOfRandomNumbers) { for (int i = 0; i < numberOfRandomNumbers; i++) { yield return randomGenerator.GetAnotherRandomNumber(); } } ... // Hooray, we won't run out of memory! foreach(var number in MakeRandomNumbers(int.MaxValue)) { Console.WriteLine(number); } 

उपर्युक्त आप जितनी चाहें उतने यादृच्छिक संख्या उत्पन्न करेंगे, लेकिन केवल उन्हें उत्पन्न कर लें, क्योंकि वे एक उपर्युक्त बयान के माध्यम से पूछे जाते हैं। आप इस तरह से स्मृति से बाहर नहीं चलेगा

वैकल्पिक रूप से, अगर आपको इन सभी को एक ही स्थान पर रखना चाहिए, तो उन्हें स्मृति की बजाय एक फ़ाइल में रखें

खैर, मुझे बड़ी डेटा सेट के साथ एक समान समस्या है और आवेदन को इतना डेटा का उपयोग करने के लिए मजबूर करने की कोशिश करना वास्तव में सही विकल्प नहीं है मैं आपको सबसे अच्छी टिप दे सकता हूं, यदि यह संभव हो तो छोटे हिस्से में आपके डेटा की प्रक्रिया करना है। क्योंकि बहुत अधिक डेटा से निपटना, समस्या जल्दी या बाद में वापस आ जाएगी। साथ ही, आप प्रत्येक मशीन के कॉन्फ़िगरेशन को नहीं जान सकते जो आपके ऐप्लीकेशन को चलाएंगे, इसलिए हमेशा एक जोखिम होता है कि अपवाद किसी अन्य पीसी पर होता है।

मुझे एक समान समस्या थी, यह एक स्ट्रिंगबिल्ल्डर के कारण था। टॉस्ट्रिंग ();

आपका समाधान एक्स 64 में परिवर्तित करें अगर आपको अभी भी किसी समस्या का सामना करना पड़ता है, तो नीचे की तरह एक अपवाद फेंकने वाली प्रत्येक चीज़ को अधिकतम लंबाई दें:

  var jsSerializer = new JavaScriptSerializer(); jsSerializer.MaxJsonLength = Int32.MaxValue; 

Windows प्रक्रिया की सीमा 3 जीबी तक बढ़ाएं (boot.ini या Vista बूट प्रबंधक के माध्यम से)