Как распараллелить чтение строк из входного файла, когда строки обрабатываются независимо? - PullRequest
6 голосов
/ 05 октября 2010

Я только начал с OpenMP, используя C ++.Мой последовательный код на C ++ выглядит примерно так:

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

Поскольку каждая строка в значительной степени обрабатывается независимо, я пытался использовать OpenMP для распараллеливания этого, потому что входной файл имеет порядок гигабайт.Я предполагаю, что сначала мне нужно получить количество строк во входном файле, а затем распараллелить код таким образом.Может ли кто-нибудь помочь мне здесь?

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

РЕДАКТИРОВАТЬ:

Важные вещи

  1. Каждая строкаобрабатывается независимо
  2. Порядок результатов не имеет значения

1 Ответ

2 голосов
/ 05 октября 2010

Не прямой ответ OpenMP - но вы, вероятно, ищете, подход Map / Reduce . Взгляните на Hadoop - это сделано в Java, но, по крайней мере, есть немного C ++ API.

Как правило, вы хотите обрабатывать этот объем данных на разных машинах, а не в нескольких потоках в одном процессе (ограничения виртуального адресного пространства, недостаток физической памяти, перестановка и т. Д.) В любом случае, файл на диске последовательно (который вы хотите - иначе жесткий диск просто должен будет выполнить дополнительные операции поиска для каждого из ваших потоков).

...