Подтвердить что ты не робот

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 в глобальной среде. Есть ли способы обойти это? Спасибо.

4b9b3361

Ответ 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)

Это потому, что функции, созданные в других функциях, сериализуются вместе с локальной средой, в которой они были созданы, а функции, созданные из глобальной среды, не сериализуются вместе с глобальной средой. Это может быть полезно иногда, но это также может привести к разнообразию проблем, если вы не знаете о проблеме.