چون شما از تابع file استفاده کرده بودید، این تابع ابتدا کل فایل رو بصورت خط به خط میخونه و هر خط رو در یک خونه آرایه ذخیره میکنه.
دراینصورت شما به حجم کل فایل رم استفاده میکنید چون کل فایل رو از روی هارد خوندید، خط به خط جدا کردید و روی RAM ذخیره کردید و این میتونه خیلی در بازدهی برنامه چالش برانگیز باشه.
من به جای file() از توابع fopen و fgets استفاده کردم. تابع fgets یک خط از فایل رو میخونه و بعد از اینکه کار شما با اون خط تموم شد، فراموشش میکنه و بنابراین دیگه مهم نیست که حجم فایل شما چقدر باشه، همیشه منابع اشغال شده در حداقل خواهند بود.
همینطور شما بعد از جداسازی خط های مورد نظر اون هارو در یک متغییر ذخیره میکردید، یعنی مجددا به اندازه حجم فایل خروجی رم استفاده میکردید، من به جای اینکه دامنه هارو ذخیره کنم تا در نهایت یکجا همه رو ذخیره کنم، هر خط رو در همون لحظه ذخیره میکردم در نتیجه RAM مشغول نمیشه!