R: распараллеливание с foreach
Я новичок в R. Я написал этот очень простой сценарий, чтобы подчеркнуть мою проблему. Если я запускаю это регулярно для цикла testdata обновляется на каждой итерации так, как я хочу.
a = 5
b = 4
c = 3
testdata = matrix(nrow=100, ncol=5)
for(j in 1:100){
testdata[j,1] <- a*j
testdata[j,2] <- b*j
testdata[j,3] <- c*j
testdata[j,4] <- (a+b)*j
testdata[j,5] <- (a+c)*j
}
Однако эта параллельная версия, использующая foreach, завершает вычисления, но они не обновляются в testdata.
a = 5
b = 4
c = 3
testdata = matrix(nrow=100, ncol=5)
library(foreach)
library(doParallel)
library(doMC)
registerDoMC()
getDoParWorkers() # Checking the number of cores.
foreach(j = 1:100) %dopar% {
testdata[j,1] <- a*j
testdata[j,2] <- b*j
testdata[j,3] <- c*j
testdata[j,4] <- (a+b)*j
testdata[j,5] <- (a+c)*j
}
Я пытался следовать примерам здесь и в других местах в Интернете, но большинство примеров были слишком глубокими в R Shoptalk, и я не мог следовать. Как я могу заставить эту параллельную версию делать то, что делает непараллельная версия? Благодарю.
1 ответ
Вы должны проверить документы для foreach
пакет. в foreach(j = 100)
В разделе вашего кода вы можете указать аргумент .combine
сказать foreach
как собрать свои результаты. Поскольку вам нужен фрейм / матрица данных 5x100, вы должны логически записать вектор из пяти аргументов (т.е. c(a*j, b*j, c*j, (a+b)*j, (a+c)*j)
), а также rbind
их сделать один кадр данных. Проверьте мой код ниже:
a = 5
b = 4
c = 3
library(foreach)
library(doParallel)
library(parallel)
## Assuming you want to use all of your cores
registerDoParallel(cores = detectCores())
## Specify your .combine argument below
foreach(j = 1:100, .combine = "rbind") %dopar% {
c(a*j, b*j, c*j, (a+b)*j, (a+c)*j)
}
И это выплевывает:
[,1] [,2] [,3] [,4] [,5]
result.1 5 4 3 9 8
result.2 10 8 6 18 16
result.3 15 12 9 27 24
result.4 20 16 12 36 32
result.5 25 20 15 45 40
...
Затем вы могли бы сделать еще один шаг, назначив это переменной, которую вы хотите:
...
testdata <- foreach(j = 1:100, .combine = "rbind") %dopar% {
c(a*j, b*j, c*j, (a+b)*j, (a+c)*j)
}
testdata <- as.data.frame(testdata, row.names = FALSE)
Надеюсь это поможет!