Unten finden Sie ein Stück Code in R, die ich konvertieren möchte, um als paralleler Prozess mit mehreren CPUs zu laufen. Ich versuchte mit foreach
Paket, aber ging nicht weit .. Ich konnte kein gutes Beispiel finden, wie es funktioniert angesichts der Tatsache, dass ich 3-Level Nested Loop haben. Hilfe wäre sehr willkommen. Beispiel für Code unten - Ich habe eine einfache Funktion, so dass es als Beispiel dienen kann:Konvertierung von verschachtelten for-loop zu parallel in R
celnum <- c(10,20,30)
t2 <- c(1,2,3)
allrepeat <- 10
samplefunction <- function(celnum,t2){
x <- rnorm(100,celnum,t2)
y = sample(x, 1)
z = sample(x,1)
result = y+z
result
}
Erste Ergebnisse herkömmliche Art und Weise:
z_grid <- matrix(, nrow = length(celnum), ncol = length(t2))
repetitions <- matrix(, nrow = allrepeat, ncol = 1)
set.seed=20
for(i in 1:length(celnum)){
for (j in 1:length(t2)){
for (k in 1:allrepeat) {
results <- samplefunction(celnum[i],t2[j])
repetitions[k] <- results
z_grid[i,j] <- mean(repetitions,na.rm=TRUE)
}
}
}
z_grid
nun versucht, das gleiche mit foreach zu tun:
set.seed=20
library(foreach)
library(doSNOW)
cl <- makeCluster(3, type = "SOCK")
registerDoSNOW(cl)
set.seed=20
output <- foreach(i=1:length(celnum),.combine='cbind') %:%
foreach (j=1:length(t2), .combine='c') %:%
foreach (k = 1:allrepeat) %do% {
mean(samplefunction(celnum[i],t2[j]))
}
output
Dies funktioniert nicht so, wie ich es möchte, da es eine Matrix von 30x2 Dimensionen statt 3x3 zurückgibt. Meine Absicht ist es, das Szenario für i- und j-Kombinationen k-mal zu simulieren und möchte einen Durchschnitt dieser k-Simulationen für jede Kombination von i und j erhalten.
vielleicht werfen Sie einen Blick auf die [Dokumentation] (http://stackoverflow.com/documentation/r/1677/parallel-processing/5164/parallel-processing-with-foreach-package#t=201607251334159676214) – loki
@ Loki: Danke das ist sehr gut. Ich kann eine einfache Schleife mit foreach ausführen.Ich habe jedoch eine schwierige Zeit, dieses Stück Code zu konvertieren, der mir eine Ausgabe einer Liste von vier Matrizen als Ergebnis gibt, und wo es eine geschachtelte 3-Level-Schleife gibt, um die Funktion auszuführen. Ich bin immer noch auf einer steilen Lernkurve mit R – MIH