Bir dosyayı satır satır okumanın en hızlı yolunu bulmak için bazı kıyaslamalar yapmanız gerekir. Bilgisayarımda bazı küçük testler yaptım, ancak sonuçlarımın ortamınız için geçerli olmasını bekleyemezsiniz.
StreamReader.ReadLine kullanma
Bu temel olarak sizin yönteminizdir. Herhangi bir nedenle arabellek boyutunu mümkün olan en küçük değere ayarlarsınız (128). Bunu artırmak genel olarak performansı artıracaktır. Varsayılan boyut 1.024 ve diğer iyi seçenekler 512 (Windows'ta sektör boyutu) veya 4.096 (NTFS'de küme boyutu) şeklindedir. En uygun arabellek boyutunu belirlemek için bir karşılaştırma ölçütü çalıştırmanız gerekecektir. Daha büyük bir tampon - daha hızlı değilse - en azından daha küçük bir tampondan daha yavaş değildir.
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
Yapıcı belirlemenizi sağlar FileOptions . Örneğin, başından sonuna kadar büyük bir dosyayı okuyorsanız, bundan yararlanabilirsiniz FileOptions.SequentialScan
. Yine, kıyaslama yapabileceğiniz en iyi şeydir.
File.ReadLines kullanma
Bu, kendi çözümünüze çok benzer, ancak StreamReader
1.024 sabit tampon boyutu ile uygulanmasıdır . Bilgisayarımda bu, 128 arabellek boyutuna sahip kodunuzla karşılaştırıldığında biraz daha iyi performans sağlar. Ancak, daha büyük bir arabellek boyutu kullanarak aynı performans artışını elde edebilirsiniz. Bu yöntem bir yineleyici bloğu kullanılarak uygulanır ve tüm satırlar için bellek tüketmez.
var lines = File.ReadLines(fileName);
foreach (var line in lines)
// Process line
File.ReadAllLines kullanma
Bu, önceki yönteme çok benzer, ancak bu yöntemin, döndürülen satır dizisini oluşturmak için kullanılan dizelerin bir listesini büyütmesi, böylece bellek gereksinimleri daha yüksektir. Ancak, satırlara rastgele erişmenize izin String[]
vermez , döner IEnumerable<String>
.
var lines = File.ReadAllLines(fileName);
for (var i = 0; i < lines.Length; i += 1) {
var line = lines[i];
// Process line
}
String.Split Kullanımı
Bu yöntem, büyük olasılıkla nasıl String.Split
uygulandığından dolayı, en azından büyük dosyalarda (511 KB dosyada test edilmiştir) oldukça yavaştır . Ayrıca, çözümünüzle karşılaştırıldığında gerekli belleği artıran tüm satırlar için bir dizi ayırır.
using (var streamReader = File.OpenText(fileName)) {
var lines = streamReader.ReadToEnd().Split("\r\n".ToCharArray(), StringSplitOptions.RemoveEmptyEntries);
foreach (var line in lines)
// Process line
}
Benim önerim, File.ReadLines
temiz ve verimli olduğu için kullanmaktır . Özel paylaşım seçeneklerine (örneğin FileShare.ReadWrite
, kullandığınızda ) ihtiyacınız varsa, kendi kodunuzu kullanabilirsiniz, ancak arabellek boyutunu artırmalısınız.
Fastest
size performans veya geliştirme perspektiflerden demek?