2011-01-27 15 views
14

की घोषणा पर OutOfMemoryException मुझे एक काफी बड़ी डबल सरणी 12000ish x 55000ish बनाना है। दुर्भाग्यवश, मुझे स्मृति अपवाद से बाहर निकलना है। मैं जावा में विकसित होता था और मेमोरी सेटिंग्स बदल सकता था। क्या यह सी # के साथ संभव है या यह असंभव है? मैं वीएस 2008 का उपयोग कर रहा हूं।बड़े एरे

+1

ए * काफी * बड़ी सरणी? :) – Groo

+0

मैं सुझाव दूंगा कि आप "मुख्य स्मृति से बाहर" डेटा संरचना (यानी डेटाबेस) पर विचार करें। आपको इतनी बड़ी डबल सरणी क्यों स्टोर करनी है? – bitxwise

+0

मैंने "काफी" शब्द की पसंद पर भी चुपचाप किया। –

उत्तर

25

प्रत्येक double 8 बाइट्स है, इसलिए आप केवल 5 जीबी के साथ एक एकल सरणी आवंटित करने का प्रयास कर रहे हैं। सीएलआर में लगभग 2 जीबी आईआईआरसी की एक प्रति-ऑब्जेक्ट सीमा है, यहां तक ​​कि 64-बिट सीएलआर के लिए भी। दूसरे शब्दों में, यह उपलब्ध स्मृति की कुल मात्रा नहीं है जो समस्या है (हालांकि स्पष्ट रूप से आपको समस्या होगी यदि आप पर्याप्त मेमोरी नहीं है), लेकिन प्रति-वस्तु आकार।

मेरा सुझाव है कि आप इसे छोटे सरणी में विभाजित करें, शायद कुछ विवरण के मुखौटे के पीछे। मुझे विश्वास नहीं है कि एक सरणी के लिए सीमा को हल करने का कोई तरीका है।

संपादित करें: आप सरणियों की एक सरणी के लिए जा सकते हैं - एक दांतेदार सरणी उर्फ:

double[][] array = new double[12000][]; 
for (int i = 0; i < array.Length; i++) 
{ 
    array[i] = new double[55000]; 
} 

है कि आप के लिए स्वीकार्य होगा?

(आप एक आयताकार सरणी (double[,]) के रूप में है कि एक ही प्रति-वस्तु आकार समस्या के लिए होता है उपयोग कर सकते हैं नहीं।)

+0

+1 सेट करते समय कोई भी समस्या का समाधान कर सकता है। मुझे इतना आलसी नहीं होना चाहिए – Ian

+0

ठीक है धन्यवाद। तो यह वर्चुअल मेमोरी का उपयोग नहीं कर सका? – cs0815

+1

युगल की एक एकल सरणी के बजाय, मुझे लगता है कि उसका मतलब है कि 2 डी सरणी – bitxwise

0

ठीक है या तो आप स्मृति से बाहर हैं (कुछ प्रोग्राम बंद करें) या आप स्मृति आवंटन सीमा (लगभग 2 जीबी) मार रहे हैं, इस मेमोरी को एक संगत ब्लॉक होना चाहिए। आप 64 बिट मशीन का उपयोग कर सकते हैं, इस मामले में आपको अधिक मेमोरी उपलब्ध होगी या मुझे लगता है कि आप एप्लिकेशन को बड़े पते से अवगत करा सकते हैं (गुगलिंग आपको बताएगा कि अगर यह इस मामले में संभव है तो यह कैसे करें)।

मान लें कि आप बड़ी पता जागरूकता के लिए Boot.ini फ़ाइल में एक/3 जीबी स्विच जोड़ते हैं।

9

जब से तुम 2GB से अधिक वस्तुओं का निर्माण नहीं कर सकते हैं करने के लिए MemoryMappedFile उपयोग करने के लिए कोशिश कर सकते हैं आवश्यक आकार की स्मृति के खंड के साथ काम करते हैं।

 

var data = MemoryMappedFile.CreateNew("big data", 12000L * 55000L); 
var view = data.CreateViewAccessor(); 
var rnd = new Random(); 

for (var i = 0L; i < 12000L; ++i) 
{ 
    for (var j = 0L; j < 55000L; ++j) 
    { 
     var input = rnd.NextDouble(); 
     view.Write<double>(i * 55000L + j, ref input); 
    } 
} 
 
4

प्रदान करना है कि अपने कुल स्मृति के लिए पर्याप्त है, तो आप छोटे सरणियों का एक समूह बनाने, और उन्हें एक ही IList<T>, या कुछ अन्य अनुक्रमित इंटरफ़ेस में लपेटकर द्वारा LOH विखंडन से उत्पन्न स्मृति अपवाद से रोका जा सकता है।

BigArray<T>, getting around the 2GB array size limit

क्रेडिट:: this post (C# chunked array)

यह लिंक है जो इसे का वर्णन है।

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