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
- Cada línea se procesa independientemente
- Orden de los resultados no importan
Usted dice que cada línea es independiente, pero ¿qué pasa con el orden de los resultados? – aneccodeal
@aneccodeal: Eso también es independiente porque, al final, insertaré estos datos en una base de datos. – Legend
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. –