Сокращение времени выполнения - PullRequest
1 голос
/ 17 марта 2012

У меня есть концептуальный вопрос.

Предположим, у меня есть процедура (любой язык), которая принимает набор данных в качестве входных данных, обрабатывает их и записывает выходные данные в массив.Этот массив используется вниз по течению для дальнейшей обработки.Проблема в том, что код имеет большое время выполнения.Настолько большой, что его нужно оптимизировать!

Я предлагаю разделить входной набор данных на более мелкие порции и вызвать процедуру для каждого набора данных параллельно.Звучит просто!

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

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

Есть ли лучший способ делать вещи параллельно?

Спасибо за ваши предложения :)

Ответы [ 2 ]

1 голос
/ 17 марта 2012

Я согласен, это похоже на MapReduce.

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

Книга Эрланга Джо Армстронга "Программирование на Erlang - программное обеспечение для параллельного мира" дает упрощенный MapReduce, который можно использовать в разных процессах.

Я нашел эти блоги, в которых рассказывается о простом MapReduce Джо:
http://bc.tech.coop/blog/070520.html
http://bc.tech.coop/blog/070601.html
которая могла бы объяснить идею и дать код Erlang.

Erlang - это Open Source, так что вы могли бы провести несколько экспериментов за небольшие затраты времени. Параллелизм и коммуникация встроены в язык, и все это работает «из коробки» на одной машине. Вам необходимо установить «ключ», чтобы виртуальные машины Erlang могли общаться, но как только это будет сделано, программу можно будет запускать в локальной сети.

1 голос
/ 17 марта 2012

Как сказал Оли, исследование решений MapReduce для вашего языка - это хорошо.Конкретный способ решения проблемы зависит от вашей проблемы как в теоретическом, так и в техническом аспектах.

Вот несколько вопросов, на которые вы могли бы ответить: можете ли вы иметь распределенный алгоритм (без центрального узла)?Можем ли мы использовать центральный узел для синхронизации вычислений (например, в базе данных)?Достаточно ли мало время пакетной обработки, чтобы считать файл io чем-то длинным?Если да, то какой сетевой уровень мы можем использовать?Мы работаем на одном компьютере и нуждаемся в IPC?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...