首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >追溯罕见错误

追溯罕见错误
EN

Stack Overflow用户
提问于 2014-04-15 11:47:07
回答 1查看 1.5K关注 0票数 5

我正在运行一个代码,需要很长时间才能计算出来。我使用foreach()%dopar%使代码并行,并在集群上运行。

它通常运行良好,但有时会崩溃,我得到以下错误:Error in { : task 4 failed - "missing value where TRUE/FALSE needed" Calls: %dopar% -> <Anonymous> Execution halted

现在它说执行停止了,但只对这个特定的核心执行,所以其他内核继续运行,最后它没有输出,但没有事先告诉我。我想这是if语句的一个问题。我试着在我的电脑上模拟代码,但它是如此罕见,以至于我无法模拟它。

代码很容易运行100个小时,执行多达10万个循环,其中只有一个会失败。

我的问题是:我能追溯错误在哪里吗?(我在集群上运行代码,所以我没有所有好的Rstudio内容)

而且,即使其中一个任务崩溃了,仍然可以从foreach()循环输出吗?

或者是其他人为了让我在电脑上崩溃而使用的方法?

我可以写代码,如果需要,请问它是否有帮助。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-04-16 13:43:58

foreach ".errorhandling“参数就是为了在这种情况下提供帮助。如果您想要预先传递错误,那么使用.errorhandling="pass"。如果您希望它过滤掉错误(这减少了结果的长度),那么使用.errorhandling="remove"。默认值为“停止”,它将引发一个错误,指示哪个任务失败。

不幸的是,大多数并行后端不支持跟踪,但doMPI支持。您只需使用startMPIcluster调用“verbose=TRUE”,跟踪将被写入有错误的工作人员的日志文件中。下面是一个在任务42上生成错误的示例:

代码语言:javascript
复制
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中返回了一个错误对象。此外,其中一个日志文件包含错误的跟踪(以及许多其他消息):

代码语言:javascript
复制
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用户都没有帮助。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23082764

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档