2011-08-23 19 views
6

Sto provando a migrare un programma C# in C++. Il programma C# legge un file di testo da 1 ~ 5 gb riga per riga e fa alcune analisi su ciascuna riga. Il codice C# è come sotto.Prestazioni di lettura di file di testo C++

using (var f = File.OpenRead(fname)) 
using (var reader = new StreamReader(f)) 
    while (!reader.EndOfStream) { 
     var line = reader.ReadLine(); 
     // do some analysis 
    } 

Per un dato file da 1,6 GB con 7 milioni di righe, questo codice impiega circa 18 secondi.

Il C++ codice che ho scritto prima di migrare è come sotto

ifstream f(fname); 
string line;  
while (getline(f, line)) { 
    // do some analysis 
} 

Il codice C++ porta sopra circa 420 secondi. Il secondo codice C++ che ho scritto è come sotto.

ifstream f(fname); 
char line[2000]; 
while (f.getline(line, 2000)) { 
    // do some analysis 
} 

Il C++ sopra richiede circa 85 secondi.

L'ultimo codice che ho provato è il codice c, come di seguito.

FILE *file = fopen (fname, "r"); 
char line[2000]; 
while (fgets(line, 2000, file) != NULL) { 
    // do some analysis 
} 
fclose (file); 

Il codice c in alto impiega circa 33 secondi.

Entrambi gli ultimi 2 codici, che analizzano le righe in char [] anziché in string, necessitano di circa 30 secondi in più per convertire char [] in string.

C'è un modo per migliorare le prestazioni del codice c/C++ per leggere un file di testo riga per riga per abbinare le prestazioni C#? (Aggiunto: Sto utilizzando Windows 7 a 64 bit OS con VC++ 10.0, 64)

+0

La tua domanda è simile a questa discussione http://stackoverflow.com/questions/7102087/how-to-enhance-the-speed-of-my-c-program-in-reading-delimited-text-files/ 7102179 # 7102179 –

+1

Una domanda interessante potrebbe essere: come lo fa C#? Questo ti darà alcune informazioni su quali ottimizzazioni hanno usato e probabilmente ne suggeriscono alcune. – ssube

risposta

9

Uno dei modi migliori per aumentare il file prestazioni di lettura è quello di utilizzare file mappati in memoria (mmap() su Unix, CreateFileMapping() ecc su Windows). Quindi il tuo file appare in memoria come un unico blocco di byte, e puoi leggerlo molto più velocemente rispetto all'I/O bufferizzato.

Per un file di dimensioni superiori a un gigabyte, è consigliabile utilizzare un sistema operativo a 64 bit (con processo a 64 bit). Ho fatto questo per elaborare un file da 30 GB in Python con risultati eccellenti.

0

suggerisco due cose:

Usa f.rdbuf()->pubsetbuf(...) per impostare un buffer di lettura più grande. Ho notato alcuni aumenti davvero significativi nelle prestazioni di fstream quando si utilizzano dimensioni di buffer più grandi.

Invece di getline(...) utilizzare read(...) per leggere più grandi blocchi di dati e analizzarli manualmente.

0

Compilare con le ottimizzazioni. C++ ha un certo overhead teorico che rimuoverà l'ottimizzatore. Per esempio. molti metodi di stringa semplici saranno in linea. Questo è probabilmente il motivo per cui la tua versione char[2000] è più veloce.