Ниже приведен пример, который использует clusterCall
внутри for
петли, чтобы отправить другой кусок кадра данных к каждому из рабочих:
library(parallel)
cl <- makeCluster(detectCores())
df <- data.frame(a=1:10, b=1:10)
ix <- splitIndices(nrow(df), length(cl))
for (i in seq_along(cl)) {
clusterCall(cl[i], function(d) {
assign('mydata', d, pos=.GlobalEnv)
NULL # don't return any data to the master
}, df[ix[[i]],,drop=FALSE])
}
Обратите внимание, что вызов clusterCall
является Подменит cl
для того, чтобы выполнить функция на отдельном работнике каждый раз через цикл for
.
Вы можете убедиться в том, что рабочие были правильно инициализированы в этом примере с помощью:
r <- do.call('rbind', clusterEvalQ(cl, mydata))
identical(df, r)
Есть более простые способы сделать это, но этот пример минимизирует объем памяти, используемый мастером, и количество данных, переданных каждый из рабочих. Это важно, когда кадр данных очень велик.
Возможно, вам нужно прочитать некоторые страницы справки для пакета 'parallel'. –
@Pascal Я быстро посмотрел на виньетку, которая появляется сначала в Google. По-видимому, это не затрагивает эту проблему. Не могли бы вы указать мне информацию, которая делает? – kennyB