फ़ाइल लाइन को पढ़ने के लिए सबसे तेज़ तरीका खोजने के लिए आपको कुछ बेंचमार्किंग करनी होगी। मैंने अपने कंप्यूटर पर कुछ छोटे परीक्षण किए हैं लेकिन आप उम्मीद नहीं कर सकते कि मेरे परिणाम आपके पर्यावरण पर लागू होंगे।
StreamReader.ReadLine का उपयोग करना
यह मूल रूप से आपकी विधि है। किसी कारण से आप बफर आकार को सबसे छोटे संभव मान (128) पर सेट करते हैं। इसे बढ़ाने से सामान्य प्रदर्शन में वृद्धि होगी। डिफ़ॉल्ट आकार 1,024 और अन्य अच्छे विकल्प 512 (विंडोज में सेक्टर आकार) या 4,096 (NTFS में क्लस्टर आकार) हैं। एक इष्टतम बफर आकार निर्धारित करने के लिए आपको एक बेंचमार्क चलाना होगा। एक बड़ा बफर है - यदि तेज नहीं है - कम से कम एक छोटे बफर की तुलना में धीमा नहीं है।
const Int32 BufferSize = 128;
using (var fileStream = File.OpenRead(fileName))
using (var streamReader = new StreamReader(fileStream, Encoding.UTF8, true, BufferSize)) {
String line;
while ((line = streamReader.ReadLine()) != null)
// Process line
}
FileStream
निर्माता आप निर्दिष्ट कर सकते हैं FileOptions । उदाहरण के लिए, यदि आप शुरू से अंत तक एक बड़ी फाइल को क्रमिक रूप से पढ़ रहे हैं, तो आपको लाभ हो सकता है FileOptions.SequentialScan
। फिर, बेंचमार्किंग सबसे अच्छी चीज है जो आप कर सकते हैं।
File.ReadLines का उपयोग करना
यह आपके अपने समाधान की तरह बहुत है सिवाय इसके कि इसे StreamReader
1,024 के निश्चित बफर आकार के साथ लागू किया गया है । मेरे कंप्यूटर पर यह 128 के बफर आकार के साथ आपके कोड की तुलना में थोड़ा बेहतर प्रदर्शन करता है। हालांकि, आप बड़े बफर आकार का उपयोग करके समान प्रदर्शन वृद्धि प्राप्त कर सकते हैं। यह विधि एक इट्रेटर ब्लॉक का उपयोग करके कार्यान्वित की जाती है और सभी लाइनों के लिए मेमोरी का उपभोग नहीं करती है।
var lines = File.ReadLines(fileName);
foreach (var line in lines)
// Process line
File.ReadAllLines का उपयोग करना
यह पिछली पद्धति की तरह बहुत है सिवाय इसके कि यह विधि लाइनों की लौटी सरणी बनाने के लिए उपयोग किए जाने वाले तार की एक सूची को बढ़ाती है ताकि स्मृति की आवश्यकताएं अधिक हों। हालाँकि, यह रिटर्न करता है String[]
और IEnumerable<String>
आपको लाइनों को बेतरतीब ढंग से एक्सेस करने की अनुमति नहीं देता है।
var lines = File.ReadAllLines(fileName);
for (var i = 0; i < lines.Length; i += 1) {
var line = lines[i];
// Process line
}
स्ट्रिंग का उपयोग कर
यह विधि काफी धीमी है, कम से कम बड़ी फ़ाइलों पर (511 KB फ़ाइल पर परीक्षण की गई), संभवतः कैसे String.Split
कार्यान्वित की गई है। यह आपके समाधान की तुलना में आवश्यक मेमोरी बढ़ाने वाली सभी लाइनों के लिए एक सरणी भी आवंटित करता है।
using (var streamReader = File.OpenText(fileName)) {
var lines = streamReader.ReadToEnd().Split("\r\n".ToCharArray(), StringSplitOptions.RemoveEmptyEntries);
foreach (var line in lines)
// Process line
}
मेरा सुझाव उपयोग करना है File.ReadLines
क्योंकि यह स्वच्छ और कुशल है। यदि आपको विशेष साझाकरण विकल्प (उदाहरण के लिए आप उपयोग करते हैं FileShare.ReadWrite
) की आवश्यकता है, तो आप अपने स्वयं के कोड का उपयोग कर सकते हैं लेकिन आपको बफर आकार में वृद्धि करनी चाहिए।
Fastest
आप प्रदर्शन या विकास दृष्टिकोण से क्या मतलब है?