我正在运行一个代码,需要很长时间才能计算出来。我使用foreach()%dopar%使代码并行,并在集群上运行。
它通常运行良好,但有时会崩溃,我得到以下错误:Error in { : task 4 failed - "missing value where TRUE/FALSE needed" Calls: %dopar% -> <Anonymous> Execution halted
现在它说执行停止了,但只对这个特定的核心执行,所以其他内核继续运行,最后它没有输出,但没有事先告诉我。我想这是if语句的一个问题。我试着在我的电脑上模拟代码,但它是如此罕见,以至于我无法模拟它。
代码很容易运行100个小时,执行多达10万个循环,其中只有一个会失败。
我的问题是:我能追溯错误在哪里吗?(我在集群上运行代码,所以我没有所有好的Rstudio内容)
而且,即使其中一个任务崩溃了,仍然可以从foreach()循环输出吗?
或者是其他人为了让我在电脑上崩溃而使用的方法?
我可以写代码,如果需要,请问它是否有帮助。
发布于 2014-04-16 13:43:58
foreach ".errorhandling“参数就是为了在这种情况下提供帮助。如果您想要预先传递错误,那么使用.errorhandling="pass"。如果您希望它过滤掉错误(这减少了结果的长度),那么使用.errorhandling="remove"。默认值为“停止”,它将引发一个错误,指示哪个任务失败。
不幸的是,大多数并行后端不支持跟踪,但doMPI支持。您只需使用startMPIcluster调用“verbose=TRUE”,跟踪将被写入有错误的工作人员的日志文件中。下面是一个在任务42上生成错误的示例:
suppressMessages(library(doMPI))
cl <- startMPIcluster(4, verbose=TRUE)
registerDoMPI(cl)
g <- function(i) {
if (i == 42) {
if (NULL) cat('hello, world\n')
}
7
}
f <- function(i) g(i)
r <- foreach(i=1:50, .errorhandling='pass') %dopar% f(i)
print(r)
closeCluster(cl)
mpi.quit()由于它使用.errorhandling="pass",脚本运行到完成,结果列表的元素42中返回了一个错误对象。此外,其中一个日志文件包含错误的跟踪(以及许多其他消息):
waiting for a taskchunk...
executing taskchunk 42 containing 1 tasks
error executing task: argument is of length zero
traceback (most recent call first):
> g(i)
> f(i)
> eval(expr, envir, enclos)
> eval(expr, envir)
> executeTask(taskchunk$argslist[[1]])
> executeTaskChunk(cl$workerid, taskchunk, envir, err, cores)
returning error results for taskchunk 42不幸的是,doMPI主要用于Linux系统,所以这对大多数Mac和Windows用户都没有帮助。
https://stackoverflow.com/questions/23082764
复制相似问题