c# - একটি টেক্সট ফাইল লাইন-দ্বারা-লাইন পড়তে দ্রুততম উপায় কি?




.net performance (6)

আপনি লাইন পড়তে একটি বিদ্যমান API ব্যবহার করতে চান, তাহলে আপনি আরও দ্রুত পেতে পারবেন না। কিন্তু বৃহত্তর অংশ পড়তে এবং পঠিত বাফারে প্রতিটি নতুন লাইন খুঁজে বের করতে সম্ভবত সম্ভবত দ্রুত হবে।

আমি লাইন দ্বারা একটি টেক্সট ফাইল লাইন পড়তে চান। আমি জানতে চাই যে আমি .NET C # বিষয়বস্তুর মধ্যে যতটা সম্ভব দক্ষতার সাথে এটি করছি।

এটাই আমি এখন পর্যন্ত চেষ্টা করছি:

var filestream = new System.IO.FileStream(textFilePath,
                                          System.IO.FileMode.Open,
                                          System.IO.FileAccess.Read,
                                          System.IO.FileShare.ReadWrite);
var file = new System.IO.StreamReader(filestream, System.Text.Encoding.UTF8, true, 128);

while ((lineOfText = file.ReadLine()) != null)
{
    //Do something with the lineOfText
}

নিম্নলিখিত কোড ব্যবহার করুন:

foreach (string line in File.ReadAllLines(fileName))

এই কর্মক্ষমতা পড়া একটি বিশাল পার্থক্য ছিল।

এটা মেমরি খরচ খরচ আসে, কিন্তু সম্পূর্ণ মূল্য!


যদি আপনার পর্যাপ্ত মেমরি থাকে তবে আমি পুরো ফাইলটি মেমরি স্ট্রীমে পড়তে কিছু পারফরম্যান্স লাভ পেয়েছি এবং তারপরে লাইনগুলি পড়ার জন্য একটি স্ট্রিম পাঠক খোলার চেষ্টা করেছি। যেহেতু আপনি আসলেই সম্পূর্ণ ফাইলটি পড়ার পরিকল্পনা করছেন, তাই এটি কিছু উন্নতির ফল পেতে পারে।


যদি আপনি .NET 4 ব্যবহার করেন তবে কেবল File.ReadLines ব্যবহার File.ReadLines যা এটি আপনার জন্য করে। আমি সন্দেহ করি এটি আপনার মতই অনেক বেশি , এটি ছাড়াও এটি FileOptions এবং একটি বৃহত্তর বাফার ব্যবহার করতে পারে (128 টি খুব ছোট মনে হয়)।


স্ট্যাক ওভারফ্লো প্রশ্নে এটি সম্পর্কে একটি ভাল বিষয় আছে 'পুরানো স্কুল' ফিরতি চেয়ে 'ফলন ফেরত' ধীর?

এটা বলে:

ReadAllLines মেমরির মধ্যে সমস্ত লাইন লোড এবং একটি স্ট্রিং []। ফাইলটি ছোট হলে সব ভাল এবং ভাল। যদি মেমরিতে ফাইলটি বড় হবে তবে ফাইলটি মেমরির বাইরে চলে যাবে।

অন্যদিকে, ReadLines, এক সময়ে এক লাইন ফেরত পেতে ফলন রিটার্ন ব্যবহার করে। এর সাথে, আপনি কোন আকার ফাইল পড়তে পারেন। এটা মেমরি মধ্যে পুরো ফাইল লোড না।

বলুন যে আপনি "foo" শব্দটি ধারণকারী প্রথম লাইন খুঁজে বের করতে চান এবং তারপর প্রস্থান করুন। ReadAllLines ব্যবহার করে, আপনাকে সম্পূর্ণ ফাইলটি মেমরিতে পড়তে হবে, এমনকি যদি প্রথম লাইনটিতে "foo" ঘটে। ReadLines দিয়ে, আপনি শুধুমাত্র একটি লাইন পড়তে। কোনটি দ্রুত হবে?


File.ReadAllLines() একটি ফাইল পড়ার সবচেয়ে সরল উপায়গুলির মধ্যে একটি, এটি ধীরে ধীরে এক।

যদি আপনি খুব বেশি না করেই একটি ফাইলে লাইন পড়তে চান তবে এই বেঞ্চমার্ক অনুসারে , ফাইলটি পড়ার দ্রুততম উপায় হল এর পুরানো পদ্ধতি:

using (StreamReader sr = File.OpenText(fileName))
{
        string s = String.Empty;
        while ((s = sr.ReadLine()) != null)
        {
               //do minimal amount of work here
        }
}

যাইহোক, যদি আপনাকে প্রতিটি লাইন দিয়ে অনেক কিছু করতে হয় তবে এই নিবন্ধটি উপসংহারে পৌঁছেছে যে সর্বোত্তম উপায় হল নিম্নলিখিতটি (এবং যদি আপনি জানেন যে আপনি কতগুলি লাইন পড়তে যাচ্ছেন তবে এটি স্ট্রিং-এর বরাদ্দ করা দ্রুততর]:

AllLines = new string[MAX]; //only allocate memory here

using (StreamReader sr = File.OpenText(fileName))
{
        int x = 0;
        while (!sr.EndOfStream)
        {
               AllLines[x] = sr.ReadLine();
               x += 1;
        }
} //Finished. Close the file

//Now parallel process each line in the file
Parallel.For(0, AllLines.Length, x =>
{
    DoYourStuff(AllLines[x]); //do your work here
});




text-files