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
- Ogni linea viene elaborato in modo indipendente
- ordine dei risultati non contano
Si dice che ogni riga è indipendente, ma per quanto riguarda l'ordine dei risultati? – aneccodeal
@aneccodeal: anche questo è indipendente perché inserirò questi dati in un database alla fine. – Legend
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. –