【问题标题】:Bug in foreach? Error in task AFTER all tasks have completed/combined?foreach 中的错误?所有任务完成/合并后任务出错?
【发布时间】:2011-07-28 14:33:00
【问题描述】:

我有一个 foreach,使用 .combine = rbind 和 112 个任务,一次 6 个并行操作。启用详细信息后,我可以看到所有任务都完成并合并,但随后我收到消息“任务 6 失败 - “缺少 TRUE/FALSE 需要的值”

所以我尝试只运行最后 12 个任务,一切正常!所以最后 12 个似乎没有任何问题,根据详细输出,前 100 个组合成功。

帮助! =)

numValues: 112, numResults: 0, stopped: TRUE
automatically exporting the following variables from the local environment:
  data, dependentVariables, groupByVariable, numberOfBinsForMissingValueHistogram, outputDirectory 
got results for task 1
numValues: 112, numResults: 1, stopped: TRUE
returning status FALSE
...
got results for task 100
numValues: 112, numResults: 100, stopped: TRUE
first call to combine function
evaluating call object to combine results:
  fun(result.1, result.2, result.3, result.4, result.5, result.7, 
    result.8, result.9, result.10, result.11, result.12, result.13, 
    result.14, result.15, result.16, result.17, result.18, result.19, 
    result.20, result.21, result.22, result.23, result.24, result.25, 
    result.26, result.27, result.28, result.29, result.30, result.31, 
    result.32, result.33, result.34, result.35, result.36, result.37, 
    result.38, result.39, result.40, result.41, result.42, result.43, 
    result.44, result.45, result.46, result.47, result.48, result.49, 
    result.50, result.51, result.52, result.53, result.54, result.55, 
    result.56, result.57, result.59, result.60, result.61, result.62, 
    result.63, result.64, result.65, result.66, result.67, result.68, 
    result.69, result.70, result.71, result.72, result.73, result.74, 
    result.75, result.76, result.77, result.78, result.79, result.80, 
    result.81, result.82, result.83, result.84, result.85, result.86, 
    result.87, result.88, result.89, result.90, result.91, result.92, 
    result.93, result.94, result.95, result.96, result.97, result.98, 
    result.99, result.100)
returning status FALSE
got results for task 101
numValues: 112, numResults: 101, stopped: TRUE
...
got results for task 112
numValues: 112, numResults: 112, stopped: TRUE
calling combine function
evaluating call object to combine results:
  fun(accum, result.101, result.102, result.103, result.104, result.105, 
    result.106, result.107, result.108, result.109, result.110, 
    result.111, result.112)
returning status TRUE
Error in { : task 6 failed - "missing value where TRUE/FALSE needed"

【问题讨论】:

  • 了解您到底在做什么会有所帮助...这样的事情可能发生在随机过程、可能依赖于启动参数的高级拟合方法、中断的输入对象等等。 traceback() 也可以提供帮助。至于错误方法,我希望你注意到 result.6 从未被包含在 combine...
  • @Joris - 我正在遍历数据框中的列并计算一堆统计数据(如 %missing、标准差等)。这是我第一次听到有关 traceback() 的信息,所以我将深入挖掘。我没有注意到结果。6!接得好!我将不得不对此进行隔离(我错误地认为 foreach 会在遇到错误时停止)
  • @Joris - 我的函数出现问题,导致任务 6 失败...您能否发表您的评论作为答案,以便我接受并给予您信任?再次感谢您发现这一点,我真的需要第二双眼睛。
  • 虽然它本身并不能解决这个问题,但我发现如果在错误发生时不让循环中止,它可以减少调试的痛苦,尤其是在需要很长时间才能完成的情况下。对我来说,包含 .errorhandling 标志很有用,例如foreach(.errorhandling = "pass")。如果需要很长时间才能完成操作,我会这样做 - 我想单独修复异常,这可能更容易和更快地修复,只要在后处理中内置检查错误结果。此外,正如 Joris 所建议的,示例代码将非常有用。
  • @Iterator - 很高兴了解.errorhandling! “停止”的文档应该提到该选项不会在出错时立即终止。有一个立即停止的选项会很好。我喜欢在错误发生时修复它们,而不必担心后处理结果。更大的问题(恕我直言)不是当 foreach 停止时。除非我错过了一个选项?似乎 foreach 没有捕获堆栈跟踪或任何可用于隔离错误的上下文。我必须连续运行我的函数来查明引发错误的代码行。

标签: r foreach


【解决方案1】:

了解您到底在做什么会有所帮助...这样的事情可能发生在随机过程、可能依赖于开始参数的高级拟合方法、中断的输入对象等等。 traceback() 也可以提供帮助,尽管在并行任务的情况下 traceback() 的输出可能非常难以阅读。但从本质上讲,特定输入和您的函数的组合出现了问题。

至于错误,我希望您注意到 result.6 从未包含在组合中。所以我会先看看 task6 到底发生了什么,以及为什么它没有返回任何输出。

【讨论】:

  • traceback() 类似,另一个有用的调试工具是设置options(error = recover)。这使您可以浏览变量,从调用错误的函数中可以看出。
【解决方案2】:

这是一个非常古老的问题,但是,我在遇到与 R 中的 foreach 类似的问题后发现了它。这可能对其他人有帮助。

我看不到原始代码,但是我发现当我将parallel::makeCluster() 中的核心数量从 24 减少到 16 时,错误 “task XX failed” 无法重现。自从我花时间挖掘并行代码以来已经有好几年了,但我会猜测一个节点要么没有分配任何可做的事情,要么没有可返回的内容。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多