Осмысление foreach - PullRequest
       1

Осмысление foreach

0 голосов
/ 12 октября 2018

Я новичок в распараллеливании цикла for с использованием foreach и пытаюсь понять, как он работает.В качестве примера для упражнения я создал простой список (input2) на основе фрейма данных (input).Я пытаюсь вычислить b, просматривая h и j.

library(doParallel)
library(foreach)
library(dplyr)

input <- data.frame(matrix(rnorm(200*200, 0, .5), ncol=200))
input[input <=0] =0
input['X201'] <- seq(from = 0, to = 20, length.out = 10)
input <- input %>% select(c(X201, 1:200))
input2 <- split(input, f= input$X201)

a = 0
b= 0
cl <- parallel::makeCluster(20)
doParallel::registerDoParallel(cl)
tm1 <- system.time(
  y <- 
    foreach (h = length(input2),.combine = 'cbind') %:%
    foreach (j = nrow(input2[[h]]),.combine = 'c',packages = 'foreach') %dopar%{
      a = input2[[h]][j,3]
      b = b + a
    } 

)
parallel::stopCluster(cl)
registerDoSEQ()
print("Cluster stopped.")

y составляет около 0.55 (точное значение зависит от сгенерированного случайного числа), которое является значением input2[[10]][20,3], а ненакопленная стоимость, которую я хотел.Я проверил руководство пакета foreach, но все еще не уверен, что полностью понимаю механизм функции foreach.

1 Ответ

0 голосов
/ 15 октября 2018

R foreach возвращает обратные результаты, вместо этого позволяет изменять внешнюю переменную.Поэтому не ожидайте, что a, b будут обновлены правильно.

Попробуйте следующее

cl <- parallel::makeCluster(20)
doParallel::registerDoParallel(cl)

tm2 <- system.time(
results <- foreach(h = (1:length(input2)), .combine = "c") %dopar%{
    sum( input2[[h]][1:nrow(input2[[h]]),3])
},
b <- sum(results[1:length(results)])
)
parallel::stopCluster(cl)
registerDoSEQ()
b
tm2
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...