0

我试图在 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 时间限制”错误并停止。

4

2 回答 2

0

使用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 打断而引发的错误没有被捕获,使用errorthc 提到的以捕获它,但使用 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
于 2017-09-13T17:37:59.200 回答
0

尝试这个:

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 在评论中提到的那样,该函数引发了不同的错误。因此 usingerror = ...也会捕获任何其他问题。

于 2017-09-13T17:18:40.470 回答