fgets()
কলগুলির একটি লুপ ব্যবহার করা সূক্ষ্ম সমাধান এবং লেখার জন্য সবচেয়ে সহজ for
যদিও অভ্যন্তরীণভাবে ফাইলটি 8192 বাইটের বাফার ব্যবহার করে পড়া হয় তবে আপনার কোডটিতে প্রতিটি লাইনের জন্য সেই ফাংশনটি কল করতে হবে।
প্রযুক্তিগতভাবে এটি সম্ভব যে আপনি যদি একটি বাইনারি ফাইল পড়েন তবে একটি মাইল লাইন উপলব্ধ মেমরির চেয়ে বড় হতে পারে।
এই কোডটি প্রতিটি 8kB অংশে একটি ফাইল পড়ে এবং তারপরে সেই অংশের মধ্যে নতুন লাইনের সংখ্যা গণনা করে।
function getLines($file)
{
$f = fopen($file, 'rb');
$lines = 0;
while (!feof($f)) {
$lines += substr_count(fread($f, 8192), "\n");
}
fclose($f);
return $lines;
}
যদি প্রতিটি লাইনের গড় দৈর্ঘ্য সর্বোচ্চ 4 কেবি হয় তবে আপনি ইতিমধ্যে ফাংশন কলগুলিতে সঞ্চয় শুরু করবেন এবং আপনি বড় ফাইলগুলি প্রক্রিয়া করার সময় এগুলি যুক্ত করতে পারবেন can
মাপকাঠি
আমি 1 জিবি ফাইল দিয়ে একটি পরীক্ষা চালিয়েছি; ফলাফল এখানে:
+-------------+------------------+---------+
| This answer | Dominic's answer | wc -l |
+------------+-------------+------------------+---------+
| Lines | 3550388 | 3550389 | 3550388 |
+------------+-------------+------------------+---------+
| Runtime | 1.055 | 4.297 | 0.587 |
+------------+-------------+------------------+---------+
সময়টি সেকেন্ডে রিয়েল টাইমে মাপা হয়, আসল অর্থ কী তা এখানে দেখুন
\n
উইন্ডোজ মেশিনে একটি ইউনিক্স-স্টাইল ফাইল ( ) পার্স করা হতে পারে (PHP_EOL == '\r\n'
)