Para encontrar a maneira mais rápida de ler um arquivo linha por linha, você precisará fazer alguns testes comparativos. Fiz alguns pequenos testes no meu computador, mas você não pode esperar que meus resultados se apliquem ao seu ambiente.
Usando StreamReader.ReadLine
Este é basicamente o seu método. Por algum motivo, você define o tamanho do buffer para o menor valor possível (128). Aumentar isso geralmente aumentará o desempenho. O tamanho padrão é 1.024 e outras boas opções são 512 (o tamanho do setor no Windows) ou 4.096 (o tamanho do cluster no NTFS). Você precisará executar uma referência para determinar o tamanho ideal do buffer. Um buffer maior é - se não mais rápido - pelo menos não mais lento que um buffer menor.
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
}
O FileStream
construtor permite especificar FileOptions . Por exemplo, se você estiver lendo um arquivo grande sequencialmente do começo ao fim, poderá se beneficiar FileOptions.SequentialScan
. Novamente, o benchmarking é a melhor coisa que você pode fazer.
Usando File.ReadLines
Isso é muito parecido com sua própria solução, exceto que ela é implementada usando um StreamReader
tamanho de buffer fixo de 1.024. No meu computador, isso resulta em um desempenho um pouco melhor comparado ao seu código com o tamanho do buffer de 128. No entanto, você pode obter o mesmo aumento de desempenho usando um tamanho de buffer maior. Este método é implementado usando um bloco iterador e não consome memória para todas as linhas.
var lines = File.ReadLines(fileName);
foreach (var line in lines)
// Process line
Usando File.ReadAllLines
Isso é muito parecido com o método anterior, exceto que esse método aumenta uma lista de cadeias usadas para criar a matriz de linhas retornada, para que os requisitos de memória sejam maiores. No entanto, ele retorna String[]
e não IEnumerable<String>
permite que você acesse as linhas aleatoriamente.
var lines = File.ReadAllLines(fileName);
for (var i = 0; i < lines.Length; i += 1) {
var line = lines[i];
// Process line
}
Usando String.Split
Esse método é consideravelmente mais lento, pelo menos em arquivos grandes (testados em um arquivo de 511 KB), provavelmente devido à maneira como String.Split
é implementado. Ele também aloca uma matriz para todas as linhas, aumentando a memória necessária em comparação com a sua solução.
using (var streamReader = File.OpenText(fileName)) {
var lines = streamReader.ReadToEnd().Split("\r\n".ToCharArray(), StringSplitOptions.RemoveEmptyEntries);
foreach (var line in lines)
// Process line
}
Minha sugestão é usar File.ReadLines
porque é limpo e eficiente. Se você precisar de opções especiais de compartilhamento (por exemplo, use FileShare.ReadWrite
), poderá usar seu próprio código, mas deverá aumentar o tamanho do buffer.
Fastest
que você quer dizer a partir de desempenho ou de desenvolvimento perspectivas?