2012-02-09 18 views
5

Tengo un archivo que contiene un cierto número de filas de longitud fija que tienen algunos números. Necesito leer cada fila para obtener ese número, procesarlo y escribir en un archivo. Como necesito leer cada fila, a medida que aumenta el número de filas, lleva mucho tiempo.La forma más eficiente de leer el archivo

¿Hay una manera eficiente de leer cada fila del archivo? Estoy usando C#.

+4

Pertenece a StackOverflow. –

+0

¿Tienes 4.0 o 2/3.5? –

Respuesta

0

Leer todas las filas de un archivo es siempre al menos O (n). Cuando el tamaño del archivo comienza a convertirse en un problema, es probable que sea un buen momento para buscar la creación de una base de datos para la información en lugar de archivos planos.

+0

y los archivos son el resultado de un hardware externo que estará en forma de archivos y en realidad una gran cantidad de archivos ... se apreciaría cualquier forma de leer los archivos con eficacia – Jay

14

File.ReadLines (.NET 4.0+) es probablemente la forma más eficaz de memoria para hacer esto.

Devuelve IEnumerable<string>, lo que significa que las líneas se leerán perezosamente de forma continua.

Las versiones anteriores no tienen la opción de transmisión disponible de esta manera, pero usar StreamReader para leer línea por línea conseguiría lo mismo.

+1

Esto solo está disponible en .NET 4 o mayor. Solo algo para señalar, no estoy seguro de lo que está usando el OP. –

+0

@ AaronMcIver - Buen punto. Respuesta actualizada – Oded

+0

Estaba bastante seguro de que utilicé esto en 3.5 puede ser File.ReadAllText que devuelve String Array – Venki

0

No estoy seguro es el más eficiente, pero funciona bien para mí: http://msdn.microsoft.com/en-us/library/system.io.fileinfo.aspx

//Declare a new file and give it the path to your file 
    FileInfo fi1 = new FileInfo(path); 

    //Open the file and read the text 
    using (StreamReader sr = fi1.OpenText()) 
    { 
     string s = ""; 
     // Loop through each line 
     while ((s = sr.ReadLine()) != null) 
     { 
      //Here is where you handle your row in the file 
      Console.WriteLine(s); 
     } 
    } 
+0

Lo que hago después de esto, en lugar de simplemente escribir la línea en la consola, es convertir la línea en una matriz e importar los datos a una tabla de base de datos. Parece correr muy rápido a través del archivo delimitado por tabuladores, pero casi nunca tengo que pasar por más de un par de miles de registros con él. –

+0

A menos que esté haciendo algo especial con StreamReader, que en este ejemplo no es, simplemente puede escribir 'foreach (línea var en File.ReadLines (path)) {Console.WriteLine (línea); } ' – Philip

0

No importa qué sistema operativo se está utilizando, habrá varias capas entre el código y el almacenamiento real mecanismo. Los discos duros y las unidades de cinta almacenan archivos en bloques, que en estos días suelen rondar los 4K cada uno. Si quiere leer un byte, el dispositivo leerá todo el bloque en la memoria, es más rápido de esa manera. El dispositivo y el sistema operativo también pueden mantener un caché de bloques. Por lo tanto, no hay mucho que pueda hacer para cambiar el comportamiento de lectura de archivos estándar (altamente optimizado); simplemente lea el archivo como lo necesite y deje que el sistema se encargue del resto.

Si el tiempo para procesar el archivo se está convirtiendo en un problema, hay dos opciones que pueden ayudar son:

  1. Trate de disponer la utilización de archivos más cortos. Parece que está procesando archivos de registro o algo así: ejecutar su programa con más frecuencia podría ayudar a al menos a dar la apariencia de un mejor rendimiento.

  2. Cambie la forma en que se almacenan los datos. Nuevamente, entiendo que el archivo proviene de alguna fuente externa, pero tal vez pueda hacer arreglos para que se ejecute un trabajo que periódicamente convierte el archivo sin formato a algo que puede leer más rápidamente.

Buena suerte.

Cuestiones relacionadas