লাইন দ্বারা একটি ফাইল লাইন পড়ার দ্রুততম উপায় খুঁজে পেতে আপনাকে কিছু বেঞ্চমার্কিং করতে হবে। আমি আমার কম্পিউটারে কিছু ছোট পরীক্ষা করেছি তবে আপনি আশা করতে পারবেন না যে আমার ফলাফলগুলি আপনার পরিবেশে প্রযোজ্য।
স্ট্রিমরিডার.রিডলাইন ব্যবহার করা
এটি মূলত আপনার পদ্ধতি। কোনও কারণে আপনি বাফরের আকারটিকে সবচেয়ে ছোট সম্ভাব্য মানের (128) এ সেট করেছেন। এটি বাড়ানো সাধারণভাবে কর্মক্ষমতা বাড়ায়। ডিফল্ট আকার 1,024 এবং অন্যান্য ভাল পছন্দগুলি 512 (উইন্ডোজের সেক্টর আকার) বা 4,096 (এনটিএফএসের ক্লাস্টারের আকার)। অনুকূল বাফার আকার নির্ধারণ করতে আপনাকে একটি বেঞ্চমার্ক চালাতে হবে। একটি বড় বাফার হ'ল - দ্রুত না হলে - কমপক্ষে একটি ছোট বাফারের চেয়ে ধীর না।
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
। আবার, বেঞ্চমার্কিং আপনি করতে পারেন সেরা জিনিস।
ফাইল.ইডলাইন ব্যবহার করে
এটি আপনার নিজের সমাধানের মতো খুব বেশি, ব্যতীত এটি 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 কেবি ফাইলে পরীক্ষা করা হয়) সম্ভবত এটি কীভাবে 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
আপনার কর্মক্ষমতা বা উন্নয়ন দৃষ্টিকোণ থেকে এর অর্থ কি?