2012-03-17 4 views
1

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

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

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

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

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

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

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

+4

Вы описываете [MapReduce] (http://en.wikipedia.org/wiki/Map_Reduce). –

+0

Спасибо, что сообщили об этом. Я ничего не знаю об этом. Любой идеал, если он свободно доступен, и если он будет работать с ним много? – Richeek

ответ

1

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

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

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

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

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

1

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

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

+0

Я думаю, что сейчас я могу пойти с более простым решением, так как время выполнения моей программы больше, чем время ввода-вывода файлов. Следовательно, я могу записывать все данные в файлы, а затем объединять данные путем обработки файлов. У меня точно нет распределенного алгоритма.Его просто последовательный алгоритм, который вы запускаете на множестве входных данных, отправляя задания на разные серверы. – Richeek

+0

Это разновидность распределенного алгоритма. Если ваш код не многопоточен, возможно, вы могли бы запустить несколько экземпляров вашей программы на компьютер для использования всех доступных CPU. – AsTeR

+0

да это то, что я буду делать ... и как только все вычисления будут выполнены на всех процессорах, я объединю все сгенерированные файлы :-) – Richeek

Смежные вопросы