2013-05-10 2 views
2

Сколько элементов списка отправляется каждому рабочему процессу при вызове метода parLapply()? Например, допустим, у нас есть список из 6 элементов и 2 рабочих на кластере снега SOCK. Применяет ли parLapply() два элемента списка для каждого рабочего в одном вызове отправки или отправляет один элемент для отправки?Как снег распространяет элементы списка для рабочих?

Я хочу свести к минимуму расходы на связь с кластером (у меня есть много элементов списка, которые можно обрабатывать относительно быстро каждым процессором), и из того, что я вижу на частотах процессора htop, он выглядит как снег, он посылает один элемент списка в то время , Можно ли установить количество элементов списка, отправленных в один звонок?

ответ

4

Функция parLapply разделяет входные данные на один кусок на одного работника. Он делает это с помощью функции splitList, как видно в implentation из parLapply:

function (cl = NULL, X, fun, ...) 
    do.call(c, clusterApply(cl, x = splitList(X, length(cl)), fun = lapply, 
          fun, ...), quote = TRUE) 

Так со списком из 6 элементов и 2 рабочих, он будет посылать 3 элемента для каждого работника с одного «отправить» операции на работник. Это похоже на поведение mclapply с mc.preschedule, установленным на TRUE (значение по умолчанию).

Похоже, что parLapply уже выполняет оптимизацию, которую вы хотите.

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

+0

Я согласен с заключением, но не был убежден в этом доказательстве, пока не выполнил код через 'splitList' в' splitIndices'. –

+0

@DWin: Возможно, я должен был включить результаты выполнения 'library (snow); splitList (1: 6, 2) 'в качестве доказательства. Я никогда не знаю, как много деталей. Я обычно вхожу в слишком много ... –

+0

Действительно, я полностью пропустил этот вызов splitList в коде parLapply. –

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