Para encontrar la forma más rápida de leer un archivo línea por línea, tendrá que hacer algunos puntos de referencia. He realizado algunas pequeñas pruebas en mi computadora, pero no puede esperar que mis resultados se apliquen a su entorno.
Usando StreamReader.ReadLine
Este es básicamente tu método. Por alguna razón, establece el tamaño del búfer en el valor más pequeño posible (128). Aumentar esto en general aumentará el rendimiento. El tamaño predeterminado es 1.024 y otras buenas opciones son 512 (el tamaño del sector en Windows) o 4.096 (el tamaño del clúster en NTFS). Tendrá que ejecutar un punto de referencia para determinar un tamaño de búfer óptimo. Un búfer más grande es, si no más rápido, al menos no más lento que un búfer más pequeño.
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
}
El FileStream
constructor le permite especificar FileOptions . Por ejemplo, si está leyendo un archivo grande secuencialmente de principio a fin, puede beneficiarse FileOptions.SequentialScan
. Una vez más, la evaluación comparativa es lo mejor que puede hacer.
Usando File.ReadLines
Esto es muy parecido a su propia solución, excepto que se implementa utilizando un StreamReader
tamaño de búfer fijo de 1.024. En mi computadora, esto resulta en un rendimiento ligeramente mejor en comparación con su código con un tamaño de búfer de 128. Sin embargo, puede obtener el mismo aumento de rendimiento utilizando un tamaño de búfer más grande. Este método se implementa utilizando un bloque iterador y no consume memoria para todas las líneas.
var lines = File.ReadLines(fileName);
foreach (var line in lines)
// Process line
Usando File.ReadAllLines
Esto es muy similar al método anterior, excepto que este método hace crecer una lista de cadenas utilizadas para crear la matriz de líneas devuelta, por lo que los requisitos de memoria son mayores. Sin embargo, vuelveString[]
y no le IEnumerable<String>
permite acceder aleatoriamente a las líneas.
var lines = File.ReadAllLines(fileName);
for (var i = 0; i < lines.Length; i += 1) {
var line = lines[i];
// Process line
}
Usando String.Split
Este método es considerablemente más lento, al menos en archivos grandes (probado en un archivo de 511 KB), probablemente debido a cómo String.Split
se implementa. También asigna una matriz para todas las líneas aumentando la memoria requerida en comparación con su solución.
using (var streamReader = File.OpenText(fileName)) {
var lines = streamReader.ReadToEnd().Split("\r\n".ToCharArray(), StringSplitOptions.RemoveEmptyEntries);
foreach (var line in lines)
// Process line
}
Mi sugerencia es usar File.ReadLines
porque es limpio y eficiente. Si necesita opciones especiales para compartir (por ejemplo, las que usa FileShare.ReadWrite
), puede usar su propio código, pero debe aumentar el tamaño del búfer.
Fastest
Quieres decir desde las perspectivas de desempeño o desarrollo?