2010-10-05 9 views
6

Ho appena iniziato con OpenMP utilizzando C++. Il mio codice seriale in C++ simile a questa:Come parallelizzare le righe di lettura da un file di input quando le righe vengono elaborate in modo indipendente?

#include <iostream> 
#include <string> 
#include <sstream> 
#include <vector> 
#include <fstream> 
#include <stdlib.h> 

int main(int argc, char* argv[]) { 
    string line; 
    std::ifstream inputfile(argv[1]); 

    if(inputfile.is_open()) { 
     while(getline(inputfile, line)) { 
      // Line gets processed and written into an output file 
     } 
    } 
} 

Poiché ogni linea viene elaborato più o meno in modo indipendente, stavo cercando di usare OpenMP per parallelizzare questo perché il file di input è nell'ordine di gigabyte. Quindi suppongo che per prima cosa devo ottenere il numero di linee nel file di input e quindi parallelizzare il codice in questo modo. Qualcuno può aiutarmi, per favore?

#include <iostream> 
#include <string> 
#include <sstream> 
#include <vector> 
#include <fstream> 
#include <stdlib.h> 

#ifdef _OPENMP 
#include <omp.h> 
#endif 

int main(int argc, char* argv[]) { 
    string line; 
    std::ifstream inputfile(argv[1]); 

    if(inputfile.is_open()) { 
     //Calculate number of lines in file? 
     //Set an output filename and open an ofstream 
     #pragma omp parallel num_threads(8) 
     { 
      #pragma omp for schedule(dynamic, 1000) 
      for(int i = 0; i < lines_in_file; i++) { 
       //What do I do here? I cannot just read any line because it requires random access 
      } 
     } 
    } 
} 

EDIT:

cose importanti

  1. Ogni linea viene elaborato in modo indipendente
  2. ordine dei risultati non contano
+0

Si dice che ogni riga è indipendente, ma per quanto riguarda l'ordine dei risultati? – aneccodeal

+0

@aneccodeal: anche questo è indipendente perché inserirò questi dati in un database alla fine. – Legend

+0

Supponendo che tutte le linee siano (approssimativamente) della stessa lunghezza, non è necessario contare il numero di linee (è costoso, devi leggere l'intero file!) Puoi calcolare la dimensione del file (cercare fino alla fine e vedere dove si trova il puntatore), dividerlo in otto blocchi per il numero di byte, quindi cercare ciascun puntatore del blocco (diverso da quello iniziale) in avanti finché non raggiunge una nuova riga. –

risposta

2

Non un risposta OpenMP diretta - ma quello che probabilmente stai cercando è l'approccio Map/Reduce. Dai un'occhiata a Hadoop - è fatto in Java, ma c'è almeno qualche API C++.

In generale, si desidera elaborare questa quantità di dati su macchine diverse, non in più thread nello stesso processo (limitazioni di spazio dell'indirizzo virtuale, mancanza di memoria fisica, swapping, ecc.) Anche il kernel dovrà portare il file del disco in sequenza in ogni caso (che si desidera - altrimenti il ​​disco rigido dovrà solo fare ricerche extra per ciascuno dei tuoi thread).

+0

Grazie per la spiegazione. Quello che hai detto ha perfettamente senso ora. – Legend

Problemi correlati