【发布时间】:2012-05-29 15:32:02
【问题描述】:
在 Windows 上使用 R 中的集群时,我一直在尝试找到一种简单的方法将结果从集群传输到主服务器。如果结果是一个数组或一个简单的数字,foreach / %dopar% 语句的 .combine 选项会处理这个问题,但是如果结果是一个复杂的对象,让这样一个 randomForest 模型,如何从从属集群转移整个模型还给主人?
我尝试:使用 env=.Global 进行组合,但它在我的 Windows 7 上不起作用。
最后,我通过将对象保存到文件来解决问题。然后主人可以恢复对象。如果有人知道更优雅的方式或为什么 assing 不起作用,我感谢 cmets。
示例代码:
print(" paralelize with 8 cores ------------------------------")
library(doSNOW)
cl<-makeCluster(8)
registerDoSNOW(cl)
clusterEvalQ(cl, library(randomForest))
clusterExport(cl, "x")
clusterExport(cl, "y")
clusterExport(cl, "x.selected")
makeModel <- function(i){
m <- randomForest(x,x.selected[i,],mtry=250,sampsize=3200,ntree = 3000,do.trace=TRUE)
eval(parse(text = paste("model_",i," <- m",sep="")))
eval(parse( text =paste("save(model_", i, ", file =\"model_", i, ".Rdata\")",sep="" ) ))
}
foreach(i = 1:length(x.selected[,1]),.verbose = TRUE ) %dopar% makeModel(i)
stopCluster(cl)
foreach(i = 1:length(x.selected[,1]),.verbose = TRUE ) %do%
load(paste("model_",i,".RData",sep=""))
【问题讨论】:
-
不知道
foreach返回的是哪种类型的对象,貌似默认返回的不是对象列表。也许它试图以某种方式组合每个节点的结果但未能做到这一点。但是您可以使用clusterApply而不是foreach。然后,您将收到一个模型列表。
标签: r parallel-processing