2014-04-21 5 views
10

के साथ OutOfMemoryException मैं वस्तुओं के एक बहुत बड़े (althought बहुत गहरे) ग्राफ के साथ एक बाइनरीसेरियलाइज़र का उपयोग कर रहा हूँ। मेरे पास 12 गीगा स्वैप द्वारा समर्थित 8 जीबी रैम है और मुझे आउटऑफ मेमरी एक्सेप्शन मिल रहा है जब सीरियलाइजिंग की अपेक्षा की जाती है (यह संभव है कि ग्राफ 2 जीबी के करीब या उससे अधिक हो)।gcAllowVeryLargeObjects

हालांकि जब मैं gcAllowVeryLargeObjects का उपयोग करता हूं तो यह बेहतर नहीं होता है, मुझे अभी भी एक ही अपवाद मिलता है और मैं निश्चित रूप से कुछ ऐसी चीज पर काम कर रहा हूं जो स्मृति में होना चाहिए (कम से कम स्वैप के साथ)।

क्या ऐसा कुछ भी है जो मैं एक ही सुविधा सेट प्राप्त करने के लिए इस तरह से क्रमबद्ध करने का समर्थन करने के लिए कर सकता हूं लेकिन संभवतः चंक्स में परिणाम प्राप्त कर रहा हूं?

मेरे क्रमबद्धता कोड के बारे में कुछ खास नहीं है:

public static byte[] Serialize(this object o) 
    { 
     var ms = new MemoryStream(); 
     var bf = new BinaryFormatter(); 
     bf.Serialize(ms, o); 
     ms.Position = 0; 
     return ms.ToArray(); 
    } 

वस्तु मैं serializing कर रहा हूँ मदों की सरणियों कि खुद सरणी आदि शामिल होता है, लेकिन पूर्ण ग्राफ में ही नहीं है "कि" बड़े (यह इंडेक्सिंग डेटा का परिणाम, स्रोत पर, पहले से ही लगभग 1 जीबी आकार में है)।

यह जीसी विखंडन के कारण नहीं है (बड़े ढेर को कॉम्पैक्ट करने में मदद नहीं मिली)।

+3

मैं तुम्हें एक 64-बिट ऑपरेटिंग सिस्टम का उपयोग कर रहे मान:

विवरण और इतिहास निम्नलिखित जवाब में पाया जा सकता है? –

+1

और x64 प्रक्रिया ...? –

+0

क्या कोई कारण है कि आप फाइल के बजाए स्मृति में बड़ी चीज को क्रमबद्ध कर रहे हैं? यदि मैं इस अधिकार को देख रहा हूं, तो आपकी स्मृति आवश्यकताएं निष्पादन के एक बिंदु पर संरचना के आकार (संरचना स्वयं, मेमोरीस्ट्रीम सामग्री, और मेमरीस्ट्रीम से बाइट सरणी) के आकार से कम से कम 3 गुना हैं। क्या आप इसके बजाए फ़ाइल को क्रमबद्ध कर सकते हैं? – LB2

उत्तर

15

डिफ़ॉल्ट रूप से AnyCPU x86 और x64 ओएस दोनों पर 32 बिट प्रक्रिया के रूप में चलता है। तो gcAllowVeryLargeObjects के साथ भी x64 ओएस पर सेट आप एड्रेस स्पेस की 4 जीबी सीमा (x86 पर 2 जीबी) में चलाते हैं।

समाधान गुणों पर> 32 बिट "संपत्ति को अनचेक करने के लिए ->" बिल्ड "टैब को बदलने के लिए। What is the purpose of the "Prefer 32-bit" setting in Visual Studio 2012 and how does it actually work?