当列表项失败或耗时太长时,如何超时?

Mai*_*ura 12 multicore r plyr

对于我目前参与的几项工作,我通过一系列功能运行具有大量参数组合的大型数据集.这些函数有一个包装器(所以我可以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')
Run Code Online (Sandbox Code Playgroud)

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

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)
}
Run Code Online (Sandbox Code Playgroud)

这是最有效的方法吗?如果由于某种原因,特定的变量组合会使模型崩溃,我需要它返回NULL并继续进行其余的操作.但是,我仍然有一些问题,这个问题不会优雅地失败.

b)有时某些输入组合不会使模型崩溃,但需要很长时间才能收敛.我对我的集群上的计算时间设置了一个限制(比如说6个小时),所以我不会把我的资源浪费在被卡住的东西上.如何包含超时,如果函数调用在单个列表项上花费的时间超过x时间,它应该继续?计算花费的时间是微不足道的,但是模拟中间的函数不能被中断以检查时间,对吧?

任何想法,解决方案或技巧都表示赞赏!

Jos*_*ien 12

很可能是你能够管理优美-退出-在-timout使用的组合tryCatch(),并evalWithTimeout()R.utils包. 另请参阅这篇文章,它提供了类似的代码更详细地解压缩.

require(R.utils)

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

## evalWithTimeout() 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 = evalWithTimeout(myFun(i), timeout = 3.1), 
             TimeoutException = function(ex) "TimedOut")
}

sapply(1:5, myWrapperFunction)
# [1] "1"        "4"        "9"        "TimedOut" "TimedOut"
Run Code Online (Sandbox Code Playgroud)