web-dev-qa-db-fra.com

lancer une boucle for en parallèle dans R

J'ai une boucle for qui ressemble à ceci:

for (i=1:150000) {
   tempMatrix = {}
   tempMatrix = functionThatDoesSomething() #calling a function
   finalMatrix =  cbind(finalMatrix, tempMatrix)

}

Pourriez-vous me dire comment faire ce parallèle?

J'ai essayé ceci en me basant sur un exemple en ligne, mais je ne suis pas sûr que la syntaxe soit correcte. Cela n'a pas non plus augmenté la vitesse.

finalMatrix = foreach(i=1:150000, .combine=cbind) %dopar%  {
   tempMatrix = {}
   tempMatrix = functionThatDoesSomething() #calling a function

   cbind(finalMatrix, tempMatrix)

}
33
kay

Merci pour vos commentaires. J'ai regardé parallel après avoir posté cette question.

Finalement, après quelques essais, je l'ai fait tourner. J'ai ajouté le code ci-dessous au cas où il serait utile à d'autres

library(foreach)
library(doParallel)

#setup parallel backend to use many processors
cores=detectCores()
cl <- makeCluster(cores[1]-1) #not to overload your computer
registerDoParallel(cl)

finalMatrix <- foreach(i=1:150000, .combine=cbind) %dopar% {
   tempMatrix = functionThatDoesSomething() #calling a function
   #do other things if you want

   tempMatrix #Equivalent to finalMatrix = cbind(finalMatrix, tempMatrix)
}
#stop cluster
stopCluster(cl)

Remarque - Je dois ajouter une note indiquant que si l'utilisateur alloue trop de processus, il est possible que l'utilisateur obtienne cette erreur: Error in serialize(data, node$con) : error writing to connection

Remarque - Si .combine Dans l'instruction foreach est rbind, le dernier objet renvoyé aurait été créé en ajoutant la sortie de chaque boucle rangée.

J'espère que cela sera utile pour les personnes essayant le traitement parallèle dans R pour la première fois, comme moi.

Références: http://www.r-bloggers.com/parallel-r-loops-for-windows-and-linux/https://beckmw.wordpress.com/2014/01/21/a-brief-foray-in-parallel-processing-with-r /

59
kay