如何超时一个lapply当列表项失败或时间太长?(How do I time out a lappl

2019-06-25 08:53发布

几年的努力,我参与的那一刻,我通过一系列的功能,运行与众多的参数组合的大型数据集。 该函数具有一个包装(这样我就可以mclapply ),用于在群集上易于操作。 但是,我遇到两大挑战。

一)我的参数组合大(认为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多的时间在一个单一的列表项,它应该继续前进? 计算所花费的时间是微不足道的,但功能模拟中期不能中断,检查时间,对不对?

任何想法,解决方案或技巧的赞赏!

Answer 1:

很可能是你能够管理优美-退出-在-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"


文章来源: How do I time out a lapply when a list item fails or takes too long?
标签: r multicore plyr