2012-02-09 14 views
5

Ho un file che contiene un certo numero di righe a lunghezza fissa con alcuni numeri. Ho bisogno di leggere ogni riga per ottenere quel numero e elaborarli e scrivere in un file. Dato che ho bisogno di leggere ogni riga, man mano che il numero di righe aumenta, richiede molto tempo.Il modo più efficace di leggere il file

Esiste un modo efficace di leggere ogni riga del file? Sto usando C#.

+4

Appartiene a StackOverflow. –

+0

Sei su 4.0 o 2/3.5? –

risposta

0

La lettura di tutte le righe da un file è sempre almeno O (n). Quando la dimensione del file inizia a diventare un problema, probabilmente è un buon momento per cercare di creare un database per le informazioni anziché i file flat.

+0

bene i file sono il risultato di un hardware esterno che sarà sotto forma di file e in realtà un gran numero di file .... qualsiasi modo di leggere efficientemente i file sarebbe apprezzato – Jay

14

File.ReadLines (.NET 4.0+) è probabilmente il modo più efficiente di memoria per eseguire questa operazione.

Restituisce un IEnumerable<string> che significa che le righe verranno lette in modo lenta in streaming.

Le versioni precedenti non hanno l'opzione di streaming disponibile in questo modo, ma utilizzando StreamReader per leggere riga per riga otterrebbe lo stesso.

+1

Questo è disponibile solo in .NET 4 o maggiore. Solo qualcosa da sottolineare, non sono sicuro di cosa stia usando l'OP. –

+0

@AaronMcIver - Buon punto. Risposta aggiornata – Oded

+0

Ero abbastanza sicuro di averlo usato in 3.5 potrebbe essere File.ReadAllText che restituisce una matrice di stringhe – Venki

0

Non è sicuro questo è il più efficace, ma funziona bene per me: 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

Cosa faccio dopo questo, invece di scrivere la riga sulla console, è convertire la linea in una matrice e importare i dati a una tabella di database. Sembra funzionare molto velocemente attraverso il file delimitato da tabulazioni, ma difficilmente devo passare più di un paio di migliaia di record con esso. –

+0

A meno che non stiate facendo qualcosa di speciale con StreamReader, che in questo esempio non lo siete, potete semplicemente scrivere 'foreach (var line in File.ReadLines (path)) {Console.WriteLine (line); } '. – Philip

0

Non importa quale sistema operativo che si sta utilizzando, ci saranno diversi strati tra il codice e l'immagazzinamento meccanismo. I dischi rigidi e le unità nastro archiviano i file in blocchi, che in questi giorni di solito sono di circa 4K ciascuno. Se vuoi leggere un byte, il dispositivo continuerà a leggere l'intero blocco in memoria - è solo più veloce in quel modo. Il dispositivo e il sistema operativo possono anche tenere ciascuno una cache di blocchi. Quindi non c'è molto che puoi fare per cambiare il comportamento standard (altamente ottimizzato) di lettura dei file; basta leggere il file quando ne hai bisogno e lasciare che il sistema si occupi del resto.

Se il tempo per elaborare il file sta diventando un problema, due opzioni che potrebbero aiutare sono:

  1. cercare di organizzare per usare i file più brevi. Sembra che tu stia elaborando i file di registro o qualcosa del genere: l'esecuzione del programma con maggiore frequenza potrebbe contribuire a dare almeno l'impressione di prestazioni migliori.

  2. Modificare la modalità di memorizzazione dei dati. Ancora una volta, capisco che il file provenga da una fonte esterna, ma forse puoi organizzare l'esecuzione di un lavoro che converte periodicamente il file raw in qualcosa che puoi leggere più rapidamente.

Buona fortuna.

Problemi correlati