Поскольку этому вопросу пару месяцев, надеюсь, вы уже нашли ответ. Однако, если вы все еще заинтересованы в обратной связи, вот что нужно учитывать:
При использовании foreach
с параллельным бэкэндом вы не сможете назначать переменные в глобальной среде R так, как вы пытаетесь (вы, вероятно, заметили это). При использовании последовательного бэкенда назначение будет работать, но без использования параллельного , как при doSNOW
.
Вместо этого сохраните все результаты ваших вычислений для каждой итерации в списке и верните их объекту, чтобы вы могли извлечь соответствующие результаты после того, как все вычисления были завершены.
Мое предложение начинается аналогично вашему примеру:
library(doSNOW)
MaxSearchSpace <- 44*5
cl <- makeCluster(parallel::detectCores())
# do not create the globalVariable object
registerDoSNOW(cl)
# Save the results of the `foreach` iterations as
# lists of lists in an object (`theRes`)
theRes <- foreach (ii = 2:MaxSearchSpace, .verbose=F) %dopar%
{
# do some calculations
theNorms <- rnorm(10000)
thePois <- rpois(10000, 2)
# store the results in a list
list(theNorms, thePois)
}
После завершения всех итераций извлеките результаты из theRes
и сохраните их как объекты (например, globalVariable
, globalVariable2
и т. Д.)
globalVariable1 <- do.call(cbind, lapply(theRes, "[[", 1))
globalVariable2 <- do.call(cbind, lapply(theRes, "[[", 2))
С учетом этого, если вы выполняете вычисления для каждой итерации, которые зависят от результатов вычислений из предыдущих итераций, то этот тип параллельных вычислений не является подходом для использования.