25

我正在尝试在多个内核上运行代码(我尝试了snowparallel包)。我有

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有什么办法可以解决这个问题?谢谢。

4

2 回答 2

24

The nodes don't know about the y in the global environment on the master. You need to tell them somehow.

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)
于 2012-04-10T20:39:10.240 回答
7

值得一提的是,如果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)

这是因为在其他函数中创建的函数会与创建它们的本地环境一起序列化,而从全局环境创建的函数不会与全局环境一起序列化。这有时很有用,但如果您不知道这个问题,它也可能导致各种问题。

于 2013-04-02T03:16:40.270 回答