की घोषणा पर OutOfMemoryException मुझे एक काफी बड़ी डबल सरणी 12000ish x 55000ish बनाना है। दुर्भाग्यवश, मुझे स्मृति अपवाद से बाहर निकलना है। मैं जावा में विकसित होता था और मेमोरी सेटिंग्स बदल सकता था। क्या यह सी # के साथ संभव है या यह असंभव है? मैं वीएस 2008 का उपयोग कर रहा हूं।बड़े एरे
बड़े एरे
उत्तर
प्रत्येक double
8 बाइट्स है, इसलिए आप केवल 5 जीबी के साथ एक एकल सरणी आवंटित करने का प्रयास कर रहे हैं। सीएलआर में लगभग 2 जीबी आईआईआरसी की एक प्रति-ऑब्जेक्ट सीमा है, यहां तक कि 64-बिट सीएलआर के लिए भी। दूसरे शब्दों में, यह उपलब्ध स्मृति की कुल मात्रा नहीं है जो समस्या है (हालांकि स्पष्ट रूप से आपको समस्या होगी यदि आप पर्याप्त मेमोरी नहीं है), लेकिन प्रति-वस्तु आकार।
मेरा सुझाव है कि आप इसे छोटे सरणी में विभाजित करें, शायद कुछ विवरण के मुखौटे के पीछे। मुझे विश्वास नहीं है कि एक सरणी के लिए सीमा को हल करने का कोई तरीका है।
संपादित करें: आप सरणियों की एक सरणी के लिए जा सकते हैं - एक दांतेदार सरणी उर्फ:
double[][] array = new double[12000][];
for (int i = 0; i < array.Length; i++)
{
array[i] = new double[55000];
}
है कि आप के लिए स्वीकार्य होगा?
(आप एक आयताकार सरणी (double[,]
) के रूप में है कि एक ही प्रति-वस्तु आकार समस्या के लिए होता है उपयोग कर सकते हैं नहीं।)
ठीक है या तो आप स्मृति से बाहर हैं (कुछ प्रोग्राम बंद करें) या आप स्मृति आवंटन सीमा (लगभग 2 जीबी) मार रहे हैं, इस मेमोरी को एक संगत ब्लॉक होना चाहिए। आप 64 बिट मशीन का उपयोग कर सकते हैं, इस मामले में आपको अधिक मेमोरी उपलब्ध होगी या मुझे लगता है कि आप एप्लिकेशन को बड़े पते से अवगत करा सकते हैं (गुगलिंग आपको बताएगा कि अगर यह इस मामले में संभव है तो यह कैसे करें)।
मान लें कि आप बड़ी पता जागरूकता के लिए Boot.ini फ़ाइल में एक/3 जीबी स्विच जोड़ते हैं।
जब से तुम 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);
}
}
प्रदान करना है कि अपने कुल स्मृति के लिए पर्याप्त है, तो आप छोटे सरणियों का एक समूह बनाने, और उन्हें एक ही IList<T>
, या कुछ अन्य अनुक्रमित इंटरफ़ेस में लपेटकर द्वारा LOH विखंडन से उत्पन्न स्मृति अपवाद से रोका जा सकता है।
BigArray<T>, getting around the 2GB array size limit
क्रेडिट:: this post (C# chunked array)
यह लिंक है जो इसे का वर्णन है।
- 1. बड़े एरे के लिए PHP क्विकहाश के साथ अनुभव
- 2. उसी प्रक्रिया में ऐपडोमेन्स के बीच बड़े बाइट एरे भेजें
- 3. एरे
- 4. डेटाबेस में एरे भंडारण
- 5. बेस 1 एरे को बेस 0 एरे
- 6. क्या मैं वर्चुअल एरे
- 7. दो एरे
- 8. दो एरे
- 9. jQuery एरे
- 10. दो एरे
- 11. PHP एरे
- 12. दो एरे
- 13. ऑब्जेक्ट एरे
- 14. प्रतिनिधि एरे
- 15. एक PHP एरे
- 16. ऑब्जेक्ट्स और एरे अतिरिक्त
- 17. शून्य क्षमता एरे
- 18. एक PHP एरे कैशिंग
- 19. v8 वैल्यू टू एरे
- 20. एक सी एरे
- 21. पावरहेल - एरे संयोजन
- 22. एंड्रॉइड सॉर्ट एरे
- 23. सी # एरे का शब्दकोश
- 24. प्वाइंटर्स के एरे पॉइंटर
- 25. PHP एरे टेक्स्ट फ़ाइल
- 26. पीएचपी फ़ंक्शन दो एरे
- 27. सी स्ट्रक्चर में एरे
- 28. पावरशेल चार एरे को
- 29. सी ++ पॉइंटर्स का एरे
- 30. लार्वेल में एरे पुश
ए * काफी * बड़ी सरणी? :) – Groo
मैं सुझाव दूंगा कि आप "मुख्य स्मृति से बाहर" डेटा संरचना (यानी डेटाबेस) पर विचार करें। आपको इतनी बड़ी डबल सरणी क्यों स्टोर करनी है? – bitxwise
मैंने "काफी" शब्द की पसंद पर भी चुपचाप किया। –