【发布时间】: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 <- 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) } -
还有,为什么在代码中调用
split_ex_dat$m3次? -
感谢 Vitali 有效。很抱歉,其中有 {split_ex_dat$m} 有错误。但是我正在尝试使用它来运行 glms,并且一个简单的 for 循环运行速度比 {%dopar%} 快得多,是否有更有效/更快的方式来运行它?我认为 foreach 应该可以工作?
-
scen_bin
-
当然,我刚刚创建了另一个问题;谢谢。 stackoverflow.com/questions/60498786/…
标签: r for-loop foreach data.table doparallel