ParSapply не находит объекты в глобальной среде
Я пытаюсь запустить код на нескольких ядрах (я попробовал как пакеты snow
, так и parallel
). У меня
cl <- makeCluster(2)
y <- 1:10
sapply(1:5, function(x) x + y) # Works
parSapply(cl, 1:5, function(x) x + y)
Последняя строка возвращает ошибку:
Error in checkForRemoteErrors(val) :
2 nodes produced errors; first error: object 'y' not found
Ясно, что parSapply
не находит y
в глобальной среде. Есть ли способы обойти это? Спасибо.
Ответы
Ответ 1
Узлы не знают о y
в глобальной среде на сервере. Вы должны сказать им как-то.
library(parallel)
cl <- makeCluster(2)
y <- 1:10
# add y to function definition and parSapply call
parSapply(cl, 1:5, function(x,y) x + y, y)
# export y to the global environment of each node
# then call your original code
clusterExport(cl, "y")
parSapply(cl, 1:5, function(x) x + y)
Ответ 2
Стоит отметить, что ваш пример будет работать, если из функции вызывается parSapply
, хотя реальная проблема заключается в создании функции function(x) x + y
. Например, следующий код работает правильно:
library(parallel)
fun <- function(cl, y) {
parSapply(cl, 1:5, function(x) x + y)
}
cl <- makeCluster(2)
fun(cl, 1:10)
stopCluster(cl)
Это потому, что функции, созданные в других функциях, сериализуются вместе с локальной средой, в которой они были созданы, а функции, созданные из глобальной среды, не сериализуются вместе с глобальной средой. Это может быть полезно иногда, но это также может привести к разнообразию проблем, если вы не знаете о проблеме.