В R
я пытаюсь запустить два вложенных параллельных цикла foreach
. Первый foreach
l oop встроен в функцию f
, которая выполняет несколько задач параллельно. Результаты объединяются функцией. Функция f
здесь только для иллюстрации; реальная функция, с которой я работаю, более сложна, но в итоге также возвращает скаляр или вектор.
Впоследствии мне нужно запускать f
много раз. f
запускает x
параллельных процессов, и я хочу запустить f
еще раз y
параллельно. Я считаю, что это создает всего x*y
процессов на машине. Однако способ, которым я реализую эти идеи, кажется несовместимым с foreach
, так как я получаю ошибку unserialize(socklist[[n]]) : error reading from connection
.
Как правильно реализовать этот процесс?
В качестве примечания: если мы используем %do%
для последовательной обработки во внешнем l oop, мы получим правильный результат, но это вычисление не будет выполняться параллельно.
library(doParallel)
# function f contains a random parallel processing task whose results are summed
# if we run f in the global environment we get a result
f = function(x){
cl2 = makePSOCKcluster(x)
clusterSetRNGStream(cl2)
registerDoParallel(cl2)
r = foreach(j = 1:x, .combine=rbind) %dopar% {
sample(1:j,1)
}
stopCluster(cl2)
closeAllConnections()
sum(r)
}
# Now I want to run f y=5 times
# I would expect each of the 5 workers would create x own workers
y=5
cl1 = makePSOCKcluster(y)
clusterSetRNGStream(cl1)
registerDoParallel(cl1)
foreach(j = 1:y, .combine = rbind,
.export = c('makePSOCKcluster',
'clusterSetRNGStream',
'registerDoParallel',
'stopCluster',
'closeAllConnections',
'%dopar%',
'foreach')
) %dopar% { f(j) } # use %do% for sequential processing gives the correct result
stopCluster(cl1)
closeAllConnections()