2016-10-10 3 views
2

J'ai une simulation particulière à effectuer qui prend un certain temps à s'exécuter dans R. Puisque je veux effectuer 1000 simulations, j'ai décidé d'utiliser un paquet "parallèle" pour distribuer ces simulations sur 4 cœurs. Je sais que je peux obtenir un vecteur résultant si j'ai une fonction comme suit.Comment paralléliser une fonction qui a plus d'un paramètre?

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

Ici rnorm() comporte un seul paramètre comme entrée, de sorte que je peux demander de produire 4000 valeurs à l'aide de 4 noyaux.

Mais ma simulation a plus d'un paramètre. Ma question est la suivante, puisque j'ai plus d'un paramètre en entrée, comment puis-je savoir quel paramètre doit être calculé en utilisant 4 cœurs? Si simulation1(A,B,C,m) est ma fonction où m est le nombre de simulations, je veux demander à chaque noyau de faire la simulation 250 fois, de sorte que finalement je puisse obtenir 1000 simulations. Quelqu'un peut-il me donner un indice?

Répondre

3

Vous pourriez essayer de créer un wrapper de fonction qui prend un seul argument plutôt que plusieurs.

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) 

Il vous suffira de spécifier la liste d'arguments requise pour qu'il s'agisse d'une liste de listes.

+0

C'était vraiment une bonne solution. Je tente cela et ça a bien marché. Merci. –

+1

Si la solution a répondu à votre question, assurez-vous de la marquer comme acceptée pour aider les autres à la trouver dans le futur. – rosscova

1

Je ne suis pas sûr que ce soit exactement ce que vous recherchez, mais vous devriez pouvoir ajouter les paramètres à passer à rnorm dans votre appel de fonction. Je ne l'ai pas utilisé parSapply avant, mais ici il est avec llply:

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

Notez les paramètres mean et sd étant passés à rnorm à partir de l'appel llply. parSapply devrait être capable de gérer cela de la même manière. Par exemple:

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