2017-11-01 11 views
5

मुझे कुछ बड़ी एक्सएमएल फाइलें मिली हैं, 1+ जीबी। मुझे उनके साथ कुछ फ़िल्टरिंग ऑपरेशन करने की ज़रूरत है। सबसे आसान विचार मैं ले कर आए हैं उन्हें txt और उन लोगों से ReadAllText के रूप में बचाने के लिए, और इस समय मुझे लगता है कि, हालांकि, कार्यक्रम स्मृति से बाहर दुर्घटनाओं करने की कोशिश की तरहसी # में आउटऑफमेमरी अपवाद कैसे प्राप्त करें?

var a = File.ReadAllText("file path"); 
    a = a.Replace("<", "\r\n<"); 

कुछ कार्यों कर शुरू करने के लिए है। मैंने इसे चलाने के दौरान अपने टास्क मैनेजर को देखा है और राम का उपयोग 50% तक पहुंच गया है और जिस क्षण यह पहुंचता है, कार्यक्रम मर जाता है।

क्या किसी के पास इस फ़ाइल के साथ आउटऑफमेमरी अपवाद से परहेज करने या प्रोग्राम को अधिक मेमोरी खींचने की अनुमति देने के बारे में कोई विचार है।

+3

स्ट्रिंग का उपयोग न करें, स्ट्रिंग नहीं। –

+0

प्रतिस्थापन "फ़िल्टरिंग" है, या यह कुछ और है? ['XmlReader'] पर एक नज़र डालें (https://msdn.microsoft.com/en-us/library/system.xml.xmlreader (v = vs.110) .aspx), वैसे भी। (मुझे लगता है कि यह सही है।) – Ryan

+0

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

उत्तर

4

यदि आप File.ReadAllText के साथ "स्मृति में सबकुछ पढ़ें" कहने के बजाय लाइन से लाइन कर सकते हैं, तो आप File.ReadLines के साथ "समय पर एक पंक्ति मुझे" कह सकते हैं।

यह आईनेमेरेबल लौटाएगा जो स्थगित निष्पादन का उपयोग करता है। आप इसे इस तरह कर सकते हैं:

using(StreamWriter sw = new StreamWriter(newFilePath)) 
foreach(var line in File.ReadLines(path)) 
{ 
    sw.WriteLine(line.Replace("<", "\r\n<")); 
    sw.Flush(); 
} 

आप आस्थगित निष्पादन के बारे में अधिक जानना चाहते हैं, तो आप this GitHub पेज देख सकते हैं।

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