Я новичок в распараллеливании цикла 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.