2016-07-12 26 views
13

ich eine for-Schleife, die so etwas wie dieses:Lauf einer for-Schleife parallel in R

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

} 

Können Sie mir sagen, wie diese parallel zu machen?

Ich versuchte dies anhand eines Beispiels online, bin mir aber nicht sicher, ob die Syntax korrekt ist. Es hat auch die Geschwindigkeit nicht viel erhöht.

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

    cbind(finalMatrix, tempMatrix) 

} 
+0

Lauf Dinge parallel erfordert einiges an Aufwand. Sie werden nur dann eine substantielle Geschwindigkeit erreichen, wenn 'functionThatDoesSomething' genügend Zeit braucht, bis sich der Overhead lohnt. – Gregor

+1

Ich denke, es gibt auch viel mehr Arbeit, die Sie tun müssen, bevor dieser Beitrag qualifiziert ist. Suche nach 'parallel' und' doParallel' Paketen, zum Beispiel ... – gregmacfarlane

+0

Du solltest das nicht brauchen - 'cbind (finalMatrix, tempMatrix)' - Wenn du das '.combine' Argument verwendest, gib einfach die Funktion zurück Ausgabe. – nrussell

Antwort

18

Vielen Dank für Ihr Feedback. Ich habe parallel nachgeschlagen, nachdem ich diese Frage gepostet habe.

Endlich nach ein paar Versuchen, habe ich es laufen. Ich habe den Code für den Fall gegeben, um es an andere

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) 

Hinweis nützlich ist - ich muss eine Notiz hinzufügen, dass, wenn der Benutzer zu viele Prozesse zuordnet, dann kann Benutzer diese Fehlermeldung erhalten: Error in serialize(data, node$con) : error writing to connection

Hinweis - Wenn .combine in der foreach -Anweisung rbind ist, dann wäre das zurückgegebene endgültige Objekt erstellt worden, indem die Ausgabe jeder Schleife zeilenweise angehängt wurde.

Hoffe das ist nützlich für Leute, die Parallelverarbeitung in R zum ersten Mal ausprobieren wie ich.

Referenzen: http://www.r-bloggers.com/parallel-r-loops-for-windows-and-linux/ https://beckmw.wordpress.com/2014/01/21/a-brief-foray-into-parallel-processing-with-r/