在 R 中的循环中跳过慢速任务
Skipping slow tasks in a loop in R
我正在尝试 运行 在 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",无论模拟是否超过时间限制,但目前它给我 "reached CPU time limit" 错误并停止。
试试这个:
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 = ...
也可以解决任何其他问题。
使用 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
我正在尝试 运行 在 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",无论模拟是否超过时间限制,但目前它给我 "reached CPU time limit" 错误并停止。
试试这个:
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 = ...
也可以解决任何其他问题。
使用 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