【问题标题】:Skipping slow tasks in a loop in R在 R 中循环跳过慢任务
【发布时间】:2017-09-13 16:40:57
【问题描述】:

我正在尝试在 R 中运行一个模拟,在那里我制作了一大堆系统发育树。树模拟有点问题,因为它的运行时间变化很大,有时是 0.005 秒,有时是几分钟。我想避免慢树,所以我尝试使用 evalWithTimeout 来跳过它们。到目前为止,我遇到了问题,因为我不能让它杀死慢任务而不杀死循环。 我的问题类似于this question,但该问题的解决方案对我没有帮助。

library(TreeSim)
library(R.utils)
for (i in 1:100){
  tryCatch(
    expr = {
      evalWithTimeout(sim.rateshift.taxa(10,1,c(0.5,2),c(0.5,0),
                                         c(1,1),c(0,0.5),complete=F),
      timeout=0.005)
    }, 
    TimeoutException = function(ex) cat("Timeout. Skipping.\n")
  )
  print(i)
}

这是我目前所拥有的。无论模拟是否超过时间限制,我都希望它继续打印“i”,但目前它会给我“达到 CPU 时间限制”错误并停止。

【问题讨论】:

    标签: r loops simulation phylogeny ape-phylo


    【解决方案1】:

    使用https://www.rdocumentation.org/packages/R.utils/versions/2.5.0/topics/withTimeout 作为来源。这是一个按预期工作的测试单元。

    foo = function() {
        print("Tic");
        x <- ceiling(runif(1) * 100)+1;
        for (kk in 1:x) {
            print(kk);
            Sys.sleep(runif(1));
        }
        print("Tac");
    }
    
    bar = function() { 
      for (i in 1:100) { 
        tryCatch({
          res <- withTimeout({
            foo();
         }, timeout=1.08);
        }, TimeoutException=function(ex) {
            cat("Timeout. Skipping.\n");
           }); 
        print(i); 
       } 
    }
    

    所以问题是,是否存在未被捕获的 sim.rateshift.taxa 中断引发的错误,请使用error 作为 thc 提到的以捕获该错误,但使用 TimeoutException 跳过适当的超时

    还有时间限制设置太低的问题:

    https://github.com/mhahsler/arules/issues/22

    您可能只想自己使用setTimeLimit,并确保将transient 设置为TRUE,这样您就可以更好地控制。

    这是一个取自http://blog.revolutionanalytics.com/2014/10/r-in-production-controlling-runtime.html的例子

    system.time(Sys.sleep(5))
    
    ##user system elapsed 
    ## 0.000 0.000 5.005
    
    system.time(local({
      setTimeLimit(elapsed = 1, transient = TRUE)
      Sys.sleep(5)
    }))
    
    ## Error in Sys.sleep(5): reached elapsed time limit
    
    ## Timing stopped at: 0 0 5.006
    

    【讨论】:

    • 这在示例中完美运行。当我在 foo( ),它大部分时间都有效,但取决于超时限制。将限制设置得太低会导致功能中断并出现错误“达到 CPU 时间限制”。我原以为它会以较低的限制更频繁地跳过 foo。
    • 您遇到的问题也与 R.utils 实现有关。我已经更新了答案
    【解决方案2】:

    试试这个:

    library(TreeSim)
    library(R.utils)
    for (i in 1:100){
      tryCatch(
        expr = {
          evalWithTimeout(sim.rateshift.taxa(10,1,c(0.5,2),c(0.5,0),
                                             c(1,1),c(0,0.5),complete=F), timeout=0.005)
        }, error = function(ex) cat("Timeout. Skipping.\n"))
      print(i)
    }
    

    正如@AhmedMasud 在评论中提到的,该函数抛出了一个不同的错误。因此,使用 error = ... 也会发现任何其他问题。

    【讨论】:

    • 其实不完全是,TimeoutException是tryCatch捕获的异常。实例见rdocumentation.org/packages/R.utils/versions/2.5.0/topics/…
    • 谢谢,但使用 error 在 Rstudio 中有效,而原始代码则无效。我不确定原因是什么,但答案中的代码解决了他的问题,所以请重新考虑你的否决票。
    • 它起作用的原因是因为 sim.rateshift.taxa 抛出了一些其他错误。
    猜你喜欢
    • 2019-05-17
    • 2022-01-19
    • 2014-08-29
    • 2018-01-25
    • 2023-03-08
    • 1970-01-01
    • 2016-11-15
    • 1970-01-01
    • 2023-04-03
    相关资源
    最近更新 更多