Je viens de commencer avec OpenMP en utilisant C++. Mon code série en C++ ressemble à ceci:Comment paralléliser des lignes de lecture à partir d'un fichier d'entrée lorsque les lignes sont traitées indépendamment?
#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
}
}
}
Parce que chaque ligne est à peu près indépendante traitée, je tentais d'utiliser OpenMP pour paralléliser parce que le fichier d'entrée est de l'ordre de giga-octets. Donc je devine que d'abord j'ai besoin d'obtenir le nombre de lignes dans le fichier d'entrée et paralléliser le code de cette façon. Quelqu'un peut-il m'aider s'il vous plaît ici?
#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:
choses importantes
- Chaque ligne est traité indépendamment
- Ordre des résultats ne comptent pas
Vous dites que chaque ligne est indépendante, mais qu'en est-il de l'ordre des résultats? – aneccodeal
@aneccodeal: Cela est également indépendant car j'insérerai ces données dans une base de données à la fin. – Legend
En supposant que toutes les lignes ont (approximativement) la même longueur, vous n'avez pas besoin de compter le nombre de lignes (c'est cher, vous devez lire tout le fichier!) Vous pouvez calculer la taille du fichier (chercher jusqu'à la fin et voir où se trouve le pointeur), divisez-le en huit morceaux par le nombre d'octets, puis cherchez chaque pointeur de segment (autre que le point initial) vers l'avant jusqu'à ce qu'il atteigne une nouvelle ligne. –