当列表项失败或花费太长时间时,如何使 lapply 超时?

问题描述 投票:0回答:1

对于我目前参与的几项工作,我通过一系列函数运行具有大量参数组合的大型数据集。这些函数有一个包装器(所以我可以

mclapply
)以便于在集群上操作。然而,我遇到了两个主要挑战。

a) 我的参数组合很大(想想 20k 到 100k)。有时特定的组合失败(例如,生存率太高而死亡率太低,因此模型永远不会收敛为假设场景)。对我来说,很难提前准确地弄清楚哪些组合会失败(如果我能做到这一点,生活会更轻松)。但现在我有这种类型的设置:

failsafe <- failwith(NULL, my_wrapper_function)
# This is what I run
# Note that input_variables contains a list of variables in each list item
results <-  mclapply(input_variables, failsafe, mc.cores = 72)
# On my local dual core mac, I can't do this so the equivalent would be:
results <-  llply(input_variables, failsafe,  .progress = 'text')

我的包装函数的骨架如下所示:

my_wrapper_function <- function(tlist) {
    run <- tryCatch(my_model(tlist$a, tlist$b, tlist$sA, tlist$Fec, m = NULL) , error=function(e) NULL)
...
return(run)
}

这是最有效的方法吗?如果由于某种原因,特定的变量组合使模型崩溃,我需要它返回

NULL
并继续执行其余操作。然而,我仍然有一个问题,那就是失败得不够优雅。

b)有时,某种输入组合不会使模型崩溃,但需要很长时间才能收敛。我对集群的计算时间设置了限制(比如 6 小时),这样我就不会在卡住的事情上浪费资源。如何包含超时,以便如果函数调用在单个列表项上花费超过 x 时间,它应该继续?计算所花费的时间很简单,但不能中断函数中间模拟来检查时间,对吗?

任何想法、解决方案或技巧都值得赞赏!

r multicore plyr
1个回答
14
投票

您很可能能够使用

R.utils
包中的
tryCatch()
withTimeout() 的组合来管理超时时的优雅退出。 另请参阅这篇文章,其中提供了类似的代码并且更详细地解压了它。

library(R.utils)
    
myFun <- function(x) {Sys.sleep(x); x^2}

## withTimeout() times out evaluation after 3.1 seconds, and then
## tryCatch() handles the resulting error (of class "TimeoutException")
## with grace and aplomb.
myWrapperFunction <- function(i) {
    tryCatch(expr = withTimeout(myFun(i), timeout = 3.1), 
             TimeoutException = function(ex) "TimedOut")
}
    
sapply(1:5, myWrapperFunction)
# [1] "1"        "4"        "9"        "TimedOut" "TimedOut"
© www.soinside.com 2019 - 2024. All rights reserved.