2010-10-05 17 views
6

Acabo de comenzar con OpenMP usando C++. Mi código de serie en C++ es como la siguiente:¿Cómo se pueden paralelizar las líneas de lectura de un archivo de entrada cuando las líneas se procesan independientemente?

#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 
     } 
    } 
} 

Debido a que cada línea se procesa más o menos independiente, yo estaba tratando de utilizar OpenMP para paralelizar esto porque el archivo de entrada está en el orden de gigabytes. Así que supongo que primero necesito obtener el número de líneas en el archivo de entrada y luego paralelizar el código de esta manera. ¿Puede alguien ayudarme aquí?

#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:

cosas importantes

  1. Cada línea se procesa independientemente
  2. Orden de los resultados no importan
+0

Usted dice que cada línea es independiente, pero ¿qué pasa con el orden de los resultados? – aneccodeal

+0

@aneccodeal: Eso también es independiente porque, al final, insertaré estos datos en una base de datos. – Legend

+0

Suponiendo que todas las líneas tienen (más o menos) la misma longitud, no es necesario contar el número de líneas (es caro, ¡tiene que leer todo el archivo!) Puede calcular el tamaño del archivo (buscar hasta el final y vea dónde está el puntero), divídalo en ocho fragmentos por el número de bytes, luego busque hacia adelante cada puntero de fragmento (que no sea el inicial) hasta que llegue a una nueva línea. –

Respuesta

2

No es una respuesta directa de OpenMP, pero lo que probablemente está buscando es Map/Reduce enfoque. Eche un vistazo al Hadoop - está hecho en Java, pero hay algo de API C++ al menos.

En general, desea procesar esta cantidad de datos en diferentes máquinas, no en múltiples hilos en el mismo proceso (limitaciones de espacio de direcciones virtuales, falta de memoria física, intercambio, etc.) También el núcleo tendrá que traer el archivo de disco en forma secuencial de todos modos (lo que desea; de lo contrario, el disco duro solo tendrá que hacer búsquedas adicionales para cada uno de sus hilos).

+0

Gracias por la explicación. Lo que dijiste tiene mucho sentido ahora. – Legend

Cuestiones relacionadas