मेरे पास एक बड़ी फाइल है जिसमें कई मिलियन लाइनें हैं और फ़ाइल से दूषित लाइनों को जांचने और निकालने की आवश्यकता है।बड़ी टेक्स्ट फ़ाइलों को पढ़ने और संशोधित करने के लिए 3-5 जीबी
मैंने लापरवाही से File.ReadAllLines
की कोशिश की है लेकिन यह काम नहीं किया है। फिर मैंने मूल फ़ाइल से नीचे पढ़ने और एक नए लिखने के रूप में लाइनों को स्ट्रीम करने की कोशिश की। हालांकि यह नौकरी करता है, यह कई घंटों (5+) में ऐसा करता है। मैंने बफर का उपयोग करने के बारे में पढ़ा है जो एकमात्र विकल्प की तरह लगता है लेकिन मैं इस तरह लाइन अखंडता को कैसे बनाए रखूंगा?
समाधान: स्ट्रीमवाइटर थोड़ी देर के लिए बाहर चले गए। विभाजन के बजाय, गणना का उपयोग किया जाता है।
using (FileStream inputStream = File.OpenRead((localFileToProcess + ".txt")))
{
using (StreamReader inputReader = new StreamReader(inputStream, System.Text.Encoding.GetEncoding(1254)))
{
using(StreamWriter writer=new StreamWriter(localFileToProcess,true,System.Text.Encoding.GetEncoding(1254)))
{
while (!inputReader.EndOfStream)
{
if ((tempLineValue = inputReader.ReadLine()).Count(c => c == ';') == 4)
{
writer.WriteLine(tempLineValue);
}
else
incrementCounter();
}
}
}
}
ध्यान दें कि स्प्लिट (';') एक सरणी आवंटित करता है और प्रत्येक पंक्ति के लिए स्मृति में 5 स्ट्रिंग बनाता है। यह एक कचरा कलेक्टर के लिए काम जोड़ता है। शायद आपको सिर्फ यह जांचना चाहिए कि आपकी लाइन में 4 अर्धविराम हैं? इसके अलावा प्रत्येक पुनरावृत्ति जिसे आप StreamWriter बना रहे/डिस्पोजेक्ट कर रहे हैं। शुरुआत में एक बनाने और ऑपरेशन के अंत में निपटान करना बेहतर नहीं है? – Artemix
अच्छा बिंदु। मैं बदलाव करूंगा। – mechanicum
एक स्ट्रिंग बिल्डर, प्रक्रिया में बैच पढ़ने के बारे में और फिर एक बार में लिखने के बारे में कैसे? – bhs