обработка больших данных, последовательно с tbb - PullRequest
2 голосов
/ 24 мая 2011

Я работаю над приложением c ++ для обработки больших объемов данных цитат, например.(MSFT, AMZN и т. Д.) С табличным переводом.И мне было интересно, как я это структурировал.Я смотрю на parallel_for и конвейер и concurrent_queue.

Процесс будет в основном анализировать данные, обрабатывать их и выводить в файл.Разбор и обработка могут выполняться параллельно, но вывод должен быть в порядке для каждого символа.

Eg. Input:
    - Msg #1 - AMZN #1
    - Msg #2 - AMZN #2
    - Msg #3 - IBM #1
    - Msg #4 - AMZN #3
    - Msg #5 - CSCO #1
    - Msg $6 - IBM #2

Я хотел бы использовать решение без блокировки или минимальную блокировку, но мне кажется, что я держу в concurrent_queue для поддержания порядка.

Любые идеи будут полезны

Спасибо, Дэвид

Ответы [ 3 ]

1 голос
/ 24 мая 2011

Если вы используете шаблон конвейера (класс tbb::pipeline или функция tbb::parallel_pipeline()), вы можете использовать упорядоченные фильтры, чтобы гарантировать, что выходные данные будут отображаться точно в том же порядке, в котором они были получены. И вам не понадобятся какие-либо блокировки в вашем коде для заказа.

0 голосов
/ 20 января 2012

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

Таким образом, вам не важно, какой поток завершится первым.

0 голосов
/ 20 января 2012

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

...