2012-11-16 12 views
11

मैं बड़ा TXT फ़ाइल का आकार 500 एमबी, सबसे पहले है मैंपढ़ें बिग txt फ़ाइल, मेमोरी अपवाद से

var file = new StreamReader(_filePath).ReadToEnd(); 
var lines = file.Split(new[] { '\n' }); 

का उपयोग, लेकिन यह स्मृति अपवाद के बाहर फेंक पढ़ना चाहते हैं तो मैं लाइन द्वारा लाइन को पढ़ने के लिए करने की कोशिश की लेकिन फिर से चारों ओर 15 लाख लाइनों को पढ़ने के बाद यह स्मृति अपवाद

using (StreamReader r = new StreamReader(_filePath)) 
     {    
      while ((line = r.ReadLine()) != null)    
       _lines.Add(line);    
     } 

से बाहर फेंक या मैं

foreach (var l in File.ReadLines(_filePath)) 
      { 
       _lines.Add(l); 
      } 
इस्तेमाल किया

लेकिन फिर मैं

प्रकार 'System.OutOfMemoryException' mscorlib.dll में हुई एक अपवाद प्राप्त लेकिन उपयोगकर्ता कोड में संभाला नहीं गया था

मेरे मशीन तो यह राम के 8GB के साथ शक्तिशाली मशीन है मेरी मशीन समस्या नहीं होनी चाहिए।

p.s: मैंने इस फ़ाइल को नोटपैड ++ में खोलने का प्रयास किया और मुझे 'फ़ाइल खोलने के लिए बहुत बड़ी है' अपवाद प्राप्त हुआ।

+2

प्रश्न क्या है? आप केवल चीजों का वर्णन कर रहे हैं। –

+1

संग्रह में सभी को संग्रहीत करने का क्या मतलब है? – CyberDude

+0

@AlvinWong समस्या यह है कि मैं आउटसोमरी अपवाद प्राप्त कर रहा हूं, मैं इसे कैसे हल कर सकता हूं – Behnam

उत्तर

30

बस File.ReadLines जो एक IEnumerable<string> वापस आती है और याद करने के लिए एक ही बार में सभी लाइनों लोड नहीं करता है का उपयोग करें।

foreach (var line in File.ReadLines(_filePath)) 
{ 
    //Don't put "line" into a list or collection. 
    //Just make your processing on it. 
} 
+0

वही समस्या है, भले ही खाली लूप फोरैच (फ़ाइल में रीडलाइन (_filePath) में var लाइन) {} – Behnam

+0

@Behnam आप सुनिश्चित हैं कि आपको यह प्रोग्राम आपके प्रोग्राम के अन्य हिस्सों से नहीं मिल रहा है । इसे एक खाली समाधान में आज़माएं। –

+0

मैंने अभी एक कंसोल एप्लिकेशन बनाया है जो कोड फोरैच की एक पंक्ति है (फ़ाइल। रीडलाइन (_filePath) में var line) {}, लेकिन यह फिर से अपवाद बनाते हैं। – Behnam

2

अपवाद का कारण _lines संग्रह बढ़ रहा है लेकिन बड़ी फ़ाइल नहीं पढ़ रहा है। आप लाइन और adding to some collection _lines which will be taking memory and causing out of memory execption पढ़ रहे हैं। आप केवल आवश्यक लाइनों को _lines संग्रह में रखने के लिए फ़िल्टर लागू कर सकते हैं।

+0

मैं सिर्फ उस पंक्ति को हटाता हूं जो डेटा संग्रह में डेटा जोड़ता है, लेकिन समस्या अभी भी मौजूद है। – Behnam

+1

अब यह क्या अपवाद फेंकता है? – Adil

+0

OutofMemoryException – Behnam

1

संपादित करें:

स्मृति में पूरे फ़ाइल लोड वस्तुओं विकसित करने के लिए पैदा कर रहा हो जाएगा, और अगर यह एक वस्तु के लिए पर्याप्त सन्निहित स्मृति आवंटित नहीं कर सकता .net OOM अपवाद फेंक देते हैं।

उत्तर अभी भी वही है, आपको फ़ाइल को स्ट्रीम करने की आवश्यकता है, पूरी सामग्री को नहीं पढ़ा है। इसके लिए आपके आवेदन के पुनर्चक्रण की आवश्यकता हो सकती है, हालांकि IEnumerable<> विधियों का उपयोग करके आप अनुप्रयोगों के विभिन्न क्षेत्रों और स्थगित प्रसंस्करण में व्यावसायिक प्रक्रियाओं को ढेर कर सकते हैं।


रैम 8GB के साथ एक "शक्तिशाली" मशीन, स्मृति में एक 500GB फ़ाइल स्टोर करने के लिए सक्षम होने के लिए 500 के रूप में 8. तुलना में बड़ा है नहीं जा रहा है (प्लस आप ऑपरेटिंग सिस्टम के रूप 8 नहीं मिलता कुछ हो जाएगा, आप नेट में सभी मेमोरी आवंटित नहीं कर सकते हैं। नेट, 32-बिट में 2 जीबी की सीमा है, फाइल खोलने और लाइन को स्टोर करने से डेटा दो बार होगा, ऑब्जेक्ट साइज ओवरहेड है ....)

आप पूरी चीज को स्मृति में लोड करने के लिए लोड नहीं कर सकते हैं, आपको अपनी प्रसंस्करण के माध्यम से फ़ाइल स्ट्रीम करना होगा।

+0

आपके उत्तर के लिए बहुत धन्यवाद, लेकिन यह 500 एमबी 500 जीबी – Behnam

+0

है मेरे दूसरे दृष्टिकोण में मैंने StreamReader का उपयोग करने की कोशिश की और _lines को हटाने के साथ भी। जोड़ें (रेखा); लाइन, मैं OutOfMemoryException प्राप्त कर रहा हूँ। इसलिए मैं स्पष्ट रूप से समझ नहीं पा रहा हूं कि स्ट्रीमिंग से आपका क्या मतलब है। – Behnam

+0

शायद "लाइन" टर्मिनेटर यह नहीं होना चाहिए कि यह क्या होना चाहिए? यदि रेखाएं \ r और \ n द्वारा समाप्त नहीं की जाती हैं तो आंतरिक फ़ंक्शंस शायद पूरी फ़ाइल को स्मृति में अभी भी पढ़ेगी, है ना? – igrimpe

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