我正在尝试在多个核心上运行代码(我尝试了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
。有办法解决这个问题吗?感谢。
答案 0 :(得分:23)
节点不知道主服务器上全局环境中的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)
答案 1 :(得分:6)
值得一提的是,如果在函数内调用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)
这是因为在其他函数中创建的函数与创建它们的本地环境一起序列化,而从全局环境创建的函数不与全局环境一起序列化。这有时很有用,但如果你不知道这个问题,它也会导致各种各样的问题。