Распараллелить набор в data.table; работает с циклом for, но foreach% dopar% - нет; foreach% do% работает - PullRequest
0 голосов
/ 01 марта 2020

Я пытаюсь распараллелить мой код ниже; он отлично работает с foreach% do%; но не с% допар%; Может кто-нибудь, пожалуйста, помогите.

Я просмотрел несколько других постов и попробовал несколько вещей, но, похоже, ничего не работает. Это также попытался 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)

1 Ответ

0 голосов
/ 03 марта 2020

Вы почти там, но на самом деле вы ищете следующий код, который возвращает окончательное объединенное значение после каждого параллельного запуска.

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) }

Сказав это, я не уверен, что это наиболее эффективная структура для вашей конкретной c проблемы, но это выходит за рамки этого вопроса.

...