R中的并行优化和“下沉”中间输出

时间:2015-02-17 14:46:03

标签: r optimization parallel-processing

我有一个非常难看的功能,可以减少超过7个变量。 为了加快我获得(SSH)访问群集的速度,我可以在24个核心上运行它。

问题是这个过程在几天后崩溃了,我不知道为什么会这样,但我的问题是关于其他事情:

如何让DEOPtim在一个.Rout文件中打印每个循环的输出(我希望它在崩溃之前至少完成其中一个),我可以在进程崩溃后查看(或者我停止它)? 对于24个内核中的每个内核,这应该是相同类型的输出,但我希望可以让DEoptim输出所有内核。

这是我尝试但没有运气(最后是空文件)

clusterEvalQ(cl ,library(snow)) # loads lybrary on nodes 
clusterEvalQ(cl ,library(DEoptim))
clusterEvalQ(cl ,library(cubature))

clusterExport(cl,ls())      # Exports all variables to all nodes
                            # puts all the rra values in a matrix (vector) 


zz <- file("all.Rout", open = "wt")
sink(zz)
sink(zz, type = "message")
print(system.time(parOutput<-parLapply(cl,CornerList,ParFunction)))
i<-1
while(i<= 24){
print(parOutput[[i]][[1]][1])
print(parOutput[[i]][[1]][2])
i <- i+1
}
sink(type = "message")
sink()



stopCluster(cl)  

取消接收器类型=&#34;消息&#34;没有用。

任何建议都将不胜感激!

1 个答案:

答案 0 :(得分:2)

您的示例无效,因为您在主服务器上执行sink,这对员工没有影响。

您可以使用makeCluster outfile=""选项允许工作者输出转到您的终端,但这并不适用于所有R环境,例如RStudio。 makeCluster的文档说你可以用outfile指定一个文件名,所有的工作人员都会记录到那个文件,但我发现很多输出都丢失了,所以我不知道推荐。

如果您不介意为每个工作人员使用一个文件,您可以按如下方式对每个工作人员执行sink命令:

library(snow)
cl <- makeSOCKcluster(4)

clusterApply(cl, seq_along(cl), function(i) {
  zz <<- file(sprintf('all-%d.Rout', i), open='wt')
  sink(zz)
  sink(zz, type='message')
})

r <- parLapply(cl, 1:100, function(i) {
  cat(sprintf('executing task %d\n', i))
  sqrt(i)
})

clusterEvalQ(cl, {
  sink(type='message')
  sink()
  close(zz)
  rm(zz)
})

stopCluster(cl)