这听起来很疯狂,但已经发生了三次。我有一个foreach循环设置:
library(parallel)
library(foreach)
library(doParallel)
for(j in 1:length(start_times)) {
...
cl <- makeCluster(detectCores() - 1, outfile="status.txt")
registerDoParallel(cl, cores = detectCores() - 1)
assign(paste("master_data",j,sep=""),
foreach(i = 1:nrow(start_points_data), .packages=c("doBy","plyr","fossil","geosphere","reshape","rgdal","sp","rgeos","spatialEco","maptools"), .combine=rbind) %dopar% {
print(paste(Sys.time(), ": Starting ",i," of ",nrow(start_points_data)," locations.", sep=""))
...
} )
stopCluster(cl)
}
(foreach循环嵌套在另一个循环中的原因是因为我认为这个错误是由于我的进程太长所导致的。所以我把它拆分了。)
我已经缩减了我的测试数据集,并且在我坐在办公桌前做了其他事情时已成功完成了几次。但是,如果我关闭计算机显示器,则此过程将停止,并显示以下错误:
Error in unserialize(socklist[[n]]) : error reading from connection
foreach循环中代码的每次单独迭代每个工作者只需不到一秒钟,并且查看outfile,很明显,处理器在关闭显示器的一分钟内停止,无论它经过了多少次。 foreach循环或父循环。
当Windows检测到显示器已关闭时,是否通过关闭某些内容来尝试智能化?
答案 0 :(得分:0)
首先,感谢Steve提供的outfile提示。
问题在于工人死亡。我实现了一个tryCatch()
来停止当前的集群并重新注册它。由于输出文件是在每次成功完成父循环后写入的,因此处理可以根据存在的输出文件数量从中断处获取。有点不优雅,但似乎有效。