2010-10-05 14 views
6

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

  1. Chaque ligne est traité indépendamment
  2. Ordre des résultats ne comptent pas
+0

Vous dites que chaque ligne est indépendante, mais qu'en est-il de l'ordre des résultats? – aneccodeal

+0

@aneccodeal: Cela est également indépendant car j'insérerai ces données dans une base de données à la fin. – Legend

+0

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. –

Répondre

2

Pas réponse directe OpenMP - mais ce que vous cherchez probablement est Map/Reduce approche. Jetez un oeil à Hadoop - c'est fait en Java, mais il y a au moins une API C++.

En général, vous souhaitez traiter cette quantité de données sur différentes machines, pas dans plusieurs threads dans le même processus (limitations de l'espace d'adressage virtuel, manque de mémoire physique, échange, etc.) Le noyau devra également le fichier disque en séquence de toute façon (ce que vous voulez - sinon le disque dur devra faire des recherches supplémentaires pour chacun de vos threads).

+0

Merci pour l'explication. Ce que vous avez dit est parfaitement logique maintenant. – Legend