【问题标题】:Parallelize set in data.table; works with for loop;but foreach %dopar% doesn't; foreach %do% works在 data.table 中设置并行化;适用于 for 循环;但 foreach %dopar% 不适用; foreach %do% 有效
【发布时间】:2020-06-14 03:46:09
【问题描述】:

我正在尝试并行化下面的代码;它与 foreach %do% 完美配合;但不是 %dopar%;有人可以帮忙吗?

我确实查看了其他一些帖子并尝试了一些东西,但似乎没有任何效果。是否也尝试过 parLapply。

library(data.table)
library(parallel)
library(doParallel)
library(foreach)
ex_dat <- expand.grid(a1 = 10:100, a2 = 500:600) %>% data.table

ex_dat[,m := list(c(1L,2L))]

for(i in 1:nrow(ex_dat)) set(ex_dat,i,3L,list(list(mean(c(ex_dat$a1[i],ex_dat$a2[i])),
                                                   sd(c(ex_dat$a1[i],ex_dat$a2[i])))))


split_ex_dat$m



ex_dat_1 <- expand.grid(a1 = 10:100, a2 = 500:600) %>% data.table

ex_dat_1[,m := list(c(1L,2L))]

split_ex_dat <- split(ex_dat_1, seq(1,nrow(ex_dat_1), length.out  = 10))


foreach(x = 1:10, .packages = c("data.table")) %do%
  {
    dt <- split_ex_dat[[x]]
    for(i in 1:919) set(dt,i,3L,list(list(mean(c(dt$a1[i],dt$a2[i])),
                                          sd(c(dt$a1[i],dt$a2[i])))))
  }

split_ex_dat$m


cl <- 30
clu <- makeCluster(cl)
registerDoParallel(clu)



ex_dat_1 <- expand.grid(a1 = 10:100, a2 = 500:600) %>% data.table

ex_dat_1[,m := list(c(1L,2L))]

split_ex_dat <- split(ex_dat_1, seq(1,nrow(ex_dat_1), length.out  = 10))


foreach(x = 1:10, .packages = c("data.table")) %dopar%
  {
    dt <- split_ex_dat[[x]]
    for(i in 1:919) set(dt,i,3L,list(list(mean(c(dt$a1[i],dt$a2[i])),
                                          sd(c(dt$a1[i],dt$a2[i])))))
  }

split_ex_dat$m

stopCluster(clu)

【问题讨论】:

  • 试试这个:dt &lt;- foreach(x = 1:10, .packages = c("data.table")) %dopar% { dt &lt;- split_ex_dat[[x]] for(i in 1:919) set(dt,i,3L,list(list(mean(c(dt$a1[i],dt$a2[i])), sd(c(dt$a1[i],dt$a2[i]))))) return(dt) }
  • 还有,为什么在代码中调用split_ex_dat$m 3次?
  • 感谢 Vitali 有效。很抱歉,其中有 {split_ex_dat$m} 有错误。但是我正在尝试使用它来运行 glms,并且一个简单的 for 循环运行速度比 {%dopar%} 快得多,是否有更有效/更快的方式来运行它?我认为 foreach 应该可以工作?
  • scen_bin
  • 当然,我刚刚创建了另一个问题;谢谢。 stackoverflow.com/questions/60498786/…

标签: r for-loop foreach data.table doparallel


【解决方案1】:

您快到了,但您真正要寻找的是以下代码,该代码在每次并行运行后返回最终组合值。

dt <- foreach(x = 1:10, 
.packages = c("data.table")) %dopar% {
dt <- split_ex_dat[[x]] 
for(i in 1:919) set(dt,i,3L,list(list(mean(c(dt$a1[i],dt$a2[i])), sd(c(dt$a1[i],dt$a2[i]))))) 
return(dt) }

话虽如此,我不确定这是否是针对您的特定问题最有效的框架,但这超出了本问题的范围。

【讨论】:

    猜你喜欢
    • 2016-05-20
    • 2019-07-03
    • 2011-10-11
    • 2017-06-24
    • 2015-08-21
    • 1970-01-01
    • 2013-01-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多