Untuk menemukan cara tercepat untuk membaca file baris demi baris, Anda harus melakukan benchmarking. Saya telah melakukan beberapa tes kecil di komputer saya, tetapi Anda tidak dapat berharap bahwa hasil saya berlaku untuk lingkungan Anda.
Menggunakan StreamReader.ReadLine
Ini pada dasarnya metode Anda. Untuk beberapa alasan Anda mengatur ukuran buffer ke nilai sekecil mungkin (128). Peningkatan ini secara umum akan meningkatkan kinerja. Ukuran default adalah 1.024 dan pilihan bagus lainnya adalah 512 (ukuran sektor di Windows) atau 4.096 (ukuran kluster di NTFS). Anda harus menjalankan patokan untuk menentukan ukuran buffer optimal. Buffer yang lebih besar adalah - jika tidak lebih cepat - setidaknya tidak lebih lambat dari buffer yang lebih kecil.
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
}
The FileStream
konstruktor memungkinkan Anda untuk menentukan FileOptions . Misalnya, jika Anda membaca file besar secara berurutan dari awal hingga akhir, Anda dapat mengambil manfaat dari FileOptions.SequentialScan
. Sekali lagi, pembandingan adalah hal terbaik yang dapat Anda lakukan.
Menggunakan File.ReadLines
Ini sangat mirip dengan solusi Anda sendiri kecuali itu diimplementasikan menggunakan StreamReader
dengan ukuran buffer tetap 1.024. Di komputer saya ini menghasilkan kinerja yang sedikit lebih baik dibandingkan dengan kode Anda dengan ukuran buffer 128. Namun, Anda bisa mendapatkan peningkatan kinerja yang sama dengan menggunakan ukuran buffer yang lebih besar. Metode ini diimplementasikan menggunakan blok iterator dan tidak mengkonsumsi memori untuk semua lini.
var lines = File.ReadLines(fileName);
foreach (var line in lines)
// Process line
Menggunakan File.ReadAllLines
Ini sangat mirip dengan metode sebelumnya kecuali bahwa metode ini menumbuhkan daftar string yang digunakan untuk membuat array garis yang dikembalikan sehingga persyaratan memori lebih tinggi. Namun, ia kembali String[]
dan tidak IEnumerable<String>
memungkinkan Anda mengakses jalur secara acak.
var lines = File.ReadAllLines(fileName);
for (var i = 0; i < lines.Length; i += 1) {
var line = lines[i];
// Process line
}
Menggunakan String.Split
Metode ini jauh lebih lambat, setidaknya pada file besar (diuji pada file 511 KB), mungkin karena cara String.Split
diimplementasikan. Ini juga mengalokasikan array untuk semua baris yang meningkatkan memori yang diperlukan dibandingkan dengan solusi Anda.
using (var streamReader = File.OpenText(fileName)) {
var lines = streamReader.ReadToEnd().Split("\r\n".ToCharArray(), StringSplitOptions.RemoveEmptyEntries);
foreach (var line in lines)
// Process line
}
Saran saya adalah menggunakan File.ReadLines
karena bersih dan efisien. Jika Anda memerlukan opsi berbagi khusus (misalnya Anda menggunakan FileShare.ReadWrite
), Anda dapat menggunakan kode Anda sendiri tetapi Anda harus menambah ukuran buffer.
Fastest
maksud dari kinerja atau pengembangan perspektif?