在Windows上使用R中的群集时,我一直在尝试找到一种将结果从群集传输到主服务器的简单方法。如果结果是数组或简单数字,则foreach /%dopar%语句的.combine选项会处理此问题,但如果结果是复杂对象,则允许使用这样的randomForest模型,如何从从属集群传输整个模型回到主人那里?
我尝试:使用env=.Global
进行协助,但它在我的Windows 7上无效。
最后,我将对象保存到文件。然后主人可以恢复该对象。如果有人知道更优雅的方式或为什么协助不起作用我感谢评论。
示例代码:
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=""))
答案 0 :(得分:3)
如果未指定.combine函数,foreach将返回一个列表,以便像处理clusterApply函数一样处理任意对象。许多foreach示例使用.combine="c"
,但这不适用于randomForest模型对象。如果foreach循环的主体求值为randomForest模型对象,则foreach将返回这些对象的列表。
这是foreach包中randomForest示例的简化版本,它返回列表中的模型对象,然后将它们组合在一起。我还修改了它以使用doSNOW包,如例子所示:
library(doSNOW)
library(randomForest)
cl <- makeCluster(8)
registerDoSNOW(cl)
nr <- 1000
x <- matrix(runif(100000), nr)
y <- gl(2, nr/2)
rf <- foreach(ntree=rep(125, 8), .packages='randomForest') %dopar% {
randomForest(x, y, ntree=ntree)
}
crf <- do.call('combine', rf)
print(crf)
stopCluster(cl)