了解 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
在那里工作得很好(这就是集群的意思吗?)。
没有你的实际数据,我无法真正测试任何东西,但是 mclapply
和 future_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
的工作原理,您就会知道 parLapply
与 mclapply
做同样的事情,但 back-end 不同。
所以我有一个很大的组合列表,来自我正在 运行 进行简单 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
在那里工作得很好(这就是集群的意思吗?)。
没有你的实际数据,我无法真正测试任何东西,但是 mclapply
和 future_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
的工作原理,您就会知道 parLapply
与 mclapply
做同样的事情,但 back-end 不同。