2016-10-10 3 views
2

Ich muss eine bestimmte Simulation durchführen, die einige Zeit in R benötigt. Da ich 1000 Simulationen durchführen möchte, entschied ich mich, das "parallele" Paket zu verwenden, um diese Simulationen über 4 Kerne zu verteilen. Ich weiß, dass ich einen resultierenden Vektor bekommen kann, wenn ich eine Funktion wie folgt habe.Wie parallelisiert man eine Funktion, die mehr als einen Parameter hat?

results_parallel <- parSapply(cl, c(1000,1000,1000,1000), rnorm) 

In hier rnorm() nur einen Parameter, der als Eingang, damit ich fragen können 4000 Werte mit 4 Kernen zu erzeugen.

Aber meine Simulation hat mehr als einen Parameter. Meine Frage ist, da ich mehr als einen Parameter als Eingabe habe, wie kann ich sagen, welcher Parameter mit 4 Kernen berechnet werden soll? Wenn simulation1(A,B,C,m) meine Funktion ist, wobei m die Anzahl der Simulationen ist, möchte ich jeden Kern bitten, die Simulation 250 Mal durchzuführen, damit ich schließlich 1000 Simulationen bekommen kann. Kann mir jemand einen Hinweis geben?

Antwort

3

Sie könnten versuchen, einen Funktions-Wrapper zu erstellen, der ein einzelnes Argument anstatt mehrere Einsen übernimmt.

rnorm1 <- function(ls){ 
    rnorm(n = ls$n, mean = ls$mean, sd = ls$sd) 
} 

cl <- makeCluster(2) 

example_list <- list(
     list(n=1000, mean = 0, sd = 1), 
     list(n=1000, mean = 1, sd = 2) 
) 

results_parallel <- parSapply(cl, example_list, rnorm1) 

Sie würden nur die gewünschte Liste von Argumenten angeben müssen, so dass es sich um eine Liste von Listen ist.

+0

Das war wirklich eine gute Lösung. Ich versuche das und es hat gut funktioniert. Vielen Dank. –

+1

Wenn die Lösung Ihre Frage beantwortet, stellen Sie sicher, dass Sie sie als akzeptiert markieren, damit andere sie in Zukunft finden können. – rosscova

1

Ich bin mir nicht sicher, ob Sie genau danach suchen, aber Sie sollten in der Lage sein, die Parameter, die innerhalb Ihres Funktionsaufrufs an rnorm übergeben werden sollen, hinzuzufügen. Ich habe parSapply noch nie benutzt, aber hier ist es mit llply:

doMC::registerDoMC(cores = 4) 
results <- plyr::llply(.data = c(1000,1000,1000,1000), 
         .fun = rnorm, mean = 1, sd = 0.4, 
         .parallel = T 
) 

Beachten Sie die Parameter mean und sd-rnorm aus dem llply Anruf weitergeleitet werden. parSapply sollte in der Lage sein, dies auf die gleiche Weise zu handhaben. Zum Beispiel:

results_parallel <- parSapply(cl, 
           X = c(1000,1000,1000,1000), 
           FUN = rnorm, mean = 1, sd = 0.4 
) 
Verwandte Themen