Изменение цикла на параллельную обработку в R

#r #parallel-processing

Вопрос:

Я пытаюсь запустить повторное моделирование в R параллельно, чтобы ускорить время обработки (в настоящее время выполнение кода займет около 2 недель). У меня есть все предварительно сгенерированные данные, но подгонка модели занимает целую вечность. Как я могу использовать параллельную обработку для ускорения этого процесса?

В настоящее время у меня есть:

 results = matrix(NA,num_sims,129)
for (simulation in 1:length(df)){
     LPA1=mplusobject("stuff", rdata = df)
     lpa1_fit = mplusModeler(lpa1, "df.dat", modelout = "lpa1.inp"
     results[simulation,1] = lpa1_fit$results$summaries$BIC
     results[simulation,2] = lpa1_fit$results$summaries$AIC

     LPA2=mplusobject("stuff", rdata = df)
     lpa2_fit = mplusModeler(lpa2, "df.dat", modelout = "lpa2.inp"
     results[simulation,3] = lpa2_fit$results$summaries$BIC
     results[simulation,4] = lpa2_fit$results$summaries$AIC

AND SO ON
}

I get the concept of running this in parallel, but I just can't figure out how to actually execute it.           
 

Комментарии:

1. Вот документация для пакета foreach cran.r-project.org/web/packages/foreach/foreach.pdf И снег cran.r-project.org/web/packages/snow/snow.pdf

2. Часть 1: Это распространенное заблуждение, но foreach() оно не заменяет конструкцию для цикла. Вместо этого это альтернатива функциям сокращения карты, таким как lapply() и purrr::map() . Итак, чтобы решить вашу проблему, пока игнорируйте распараллеливание и выясните, как переписать код для использования y <- lapply(...) или y <- purrr::map(...) вместо цикла for. См. < jottr.org/2019/01/11/… > для прохода.

3. Часть 2. Когда вы переписали свой код как y <- lapply(...) вызов, вы находитесь в гораздо лучшем положении для написания y <- foreach(...) %dopar% { ... } вызова. Или просто используйте y <- future_lapply(...) или y <- furrr::future_map(...) распараллеливайте свой код.