gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 01:00:52 25 4
gpt4 key购买 nike

对于我目前参与的几项工作,我正在通过一系列函数运行具有大量参数组合的大型数据集。这些函数有一个包装器(所以我可以 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 时间,它应该继续?计算花费的时间是微不足道的,但不能中断模拟中的功能来检查时间,对吧?

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

最佳答案

您很可能可以使用 tryCatch() 的组合来管理超时时优雅退出。和 evalWithTimeout()来自 R.utils包。
See also this post ,它提供了类似的代码并更详细地解压缩它。

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"

关于r - 当列表项失败或花费太长时间时,如何使 lapply 超时?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10952724/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com