了解 lapply 和 future.apply 以获得更快的循环?

Understanding lapply and future.apply for faster loops?

所以我有一个很大的组合列表,来自我正在 运行 进行简单 lm 回归的数据,但是组合列表很长,需要很长时间才能 运行 每个列表的所有 lm。我在谷歌上搜索并找到了 parallel 包并开始理解 mclapply,但随后意识到它不适用于 windows。然后我遇到了 future.apply::future_lapply

所以基本上这是我函数中最慢的部分,即:

regression<- combinations %>% 
    apply(1, paste, collapse = " + ") %>% 
    gsub(pattern = " \+ NA", replacement = "", x = .) %>% 
    paste(Y-variable, "~", .)
  fmla_nocons <- paste(fmla, "- 1")
  
  # run lm models
  model <-  lapply(fmla_nocons, function(x) lm(x, data = df))

我的组合基本上是一个看起来像这样的列表:

var 1       var 2      var 3 
variable 1 variable 2 variable 3 
variable 2 variable 3 variable 4 
...           ...      ...

这是一个很长的列表,所以第一步是全部 y~ variable 1+variable2+ variable 3,第二步是使用 lapply 到 运行 lm 回归所有不同的组合。

然而我研究使用 future_lapply 将 运行 它在多核系统上(如果我误解了请纠正我),是否还会有与 mclappy 相似的集群,或者它是否像替换 lapply (data, function(x) lm(x, data=df))future_lapply(data, function(x)lm(x, data=df)))?

任何反馈或意见都会有所帮助,感谢您的宝贵时间!

完全公开,我对future_apply一无所知。也就是说,大多数高容量集群 运行 linux,因此 mclapply 在那里工作得很好(这就是集群的意思吗?)。

没有你的实际数据,我无法真正测试任何东西,但是 mclapplyfuture_apply 的替代方法是 parLapply 函数,它基本上适用于你的情况(即 can't use a FORK, only a PSOCK cluster)。

一些代码可以为您指明方向:

library(parallel)

ncpus = parallel::detectCores()-1
cl = makeCluster(ncpus, type="PSOCK")

out = parLapply( cl, list(), function() ) 

stopCluster(cl)

而且,如果您知道 lapply/mclapply 的工作原理,您就会知道 parLapplymclapply 做同样的事情,但 back-end 不同。