我有一个非常难看的功能,可以减少超过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;没有用。
任何建议都将不胜感激!
答案 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)