makeCluster函数有时会挂在我的代码中,只需要重新运行即可解决该问题。
为了在我的代码中做到这一点,我试图使用while循环以及withTimeout函数,以使makeCluster函数在挂起时超时并重新运行。
问题在于,当我使用withTimeout创建集群时,以后无法并行访问该集群了。
library(parallel)
library(R.utils)
library(pbapply)
cl = NULL
while( is.null(cl) ){
cl = withTimeout({makeCluster(4,type = 'FORK')},timeout=3,
onTimeout="silent",envir = environment())
}
pblapply(1:3, function(x){x+1},cl = cl)
我收到的错误消息是:
序列化错误(data,node $ con,xdr = FALSE): 写入连接时出错
答案 0 :(得分:1)
未设置envir
的{{1}}参数时,将在withTimeout()
中创建集群,并且一切都会按预期进行。
.GlobalEnv
在问题中设置library(parallel)
library(R.utils)
library(pbapply)
cl <- NULL
while(is.null(cl)){
cl <- withTimeout(makeCluster(4, type='FORK'), timeout=3, onTimeout="silent")
}
pblapply(1:3, function(x){x+1}, cl = cl)
|++++++++++++++++++++++++++++++++++++++++++++++++++| 100% elapsed=00s
[[1]]
[1] 2
[[2]]
[1] 3
[[3]]
[1] 4
,它将解决函数的调用环境。后者与envir = environment()
不同,似乎不适合创建集群。有关环境的更多信息,另请参见R eval(): changed behavior when argument 'envir' is explicitly set to default value。