2015-11-12 11 views
5

Ho una serie di file di testo di grandi dimensioni (10s - 100s di migliaia di righe) che voglio analizzare riga per riga. L'idea è di verificare se la linea ha una parola/carattere/frase specifica e, per ora, registrare su un file secondario, se lo fa.C++ leggi testo riga per riga, risparmio velocità/efficienza necessari

Il codice che ho usato finora è:

ifstream infile1("c:/test/test.txt"); 
while (getline(infile1, line)) { 
    if (line.empty()) continue; 
    if (line.find("mystring") != std::string::npos) { 
     outfile1 << line << '\n'; 
    } 
} 

La fine obiettivo è quello di scrivere queste righe a un database. Il mio pensiero era di scriverli prima nel file e poi importare il file.

Il problema che sto affrontando è il tempo necessario per completare l'operazione. Sto cercando di ridurre al minimo il tempo il più lontano possibile, quindi qualsiasi suggerimento sul risparmio di tempo sullo scenario di lettura/scrittura sopra sarebbe molto gradito. Mi scuso se qualcosa è ovvio, ho appena iniziato a passare in C++.

Grazie

EDIT

Devo dire che sto usando VS2015

EDIT 2

Quindi questa era la mia colpa muto, quando si passa alla versione e cambiando il tipo di architettura ho notato aumenti di velocità notevoli. Grazie a tutti per avermi indicato in quella direzione. Sto anche guardando le cose di mmap e questo si sta rivelando utile. Grazie ragazzi!

+2

Hai compilato con le ottimizzazioni? –

+1

my 2 cents ... La lettura di ogni riga da un file ridurrà la velocità. Prova ad usare le chiamate di sistema (spero tu stia usando linux) .1.use mmap (o) 2. usa fstat o stat per conoscere la dimensione del file. Adattare dinamicamente la memoria per quella dimensione.la lettura dell'intero file in un colpo, poi fai il processo. –

+0

Cosa ne pensi di memorizzare le linee corrispondenti (vettore, forse) e scrivere nel database quando il vettore raggiunge una certa dimensione (e quando arrivi alla fine dei dati di input)? –

risposta

0

Quando si utilizza ifstream per leggere ed elaborare su/da file molto grandi, è necessario aumentare la dimensione del buffer predefinita utilizzata (in genere 512 byte).

La dimensione del buffer ottimale dipende dalle esigenze dell'utente, ma come suggerimento è possibile utilizzare la dimensione del blocco di partizione del/i file/i di lettura/scrittura. Per conoscere queste informazioni è possibile utilizzare molti strumenti o persino codice.

Esempio in Windows:

fsutil fsinfo ntfsinfo c: 

Ora, è necessario creare un nuovo buffer per ifstream in questo modo:

size_t newBufferSize = 4 * 1024; // 4K 
char * newBuffer = new char[newBufferSize]; 
ifstream infile1; 
infile1.rdbuf()->pubsetbuf(newBuffer, newBufferSize); 
infile1.open("c:/test/test.txt"); 
while (getline(infile1, line)) { 
    /* ... */ 
} 
delete newBuffer; 

fare lo stesso con il flusso di output e non dimenticare nuova serie buffer prima di aprire il file o potrebbe non funzionare.

Puoi giocare con i valori per trovare la taglia migliore per te.

Noterete la differenza.

0

Le funzioni di I/O in stile C sono molto più veloci di fstream. È possibile utilizzare fgets/fput per leggere/scrivere ogni riga di testo.

Problemi correlati