2016-07-12 48 views
13

Ho un ciclo for che è qualcosa di simile:corsa un ciclo for in parallelo a R

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

} 

Potrebbe dirmi come fare questo parallelo?

Ho provato questo in base a un esempio online, ma non sono sicuro che la sintassi sia corretta. Inoltre non ha aumentato la velocità molto.

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

    cbind(finalMatrix, tempMatrix) 

} 
+0

gestire le cose in parallelo richiede un po 'di spese generali. Otterrai solo una notevole accelerazione se 'functionThatDoSomething 'richiede abbastanza tempo per il tuo sovraccarico. – Gregor

+1

Penso che ci sia anche molto più lavoro che devi fare prima che questo post sia qualificato. Cerca i pacchetti 'paralleli' e' doParallel', ad esempio ... – gregmacfarlane

+0

Non dovresti aver bisogno di questo - 'cbind (finalMatrix, tempMatrix)' - se stai usando l'argomento '.combine', restituisci la funzione produzione. – nrussell

risposta

18

Grazie per il vostro feedback. Ho cercato parallel dopo aver postato questa domanda.

Finalmente dopo alcuni tentativi, l'ho avviato. Ho aggiunto il codice qui sotto nel caso in cui è utile agli altri

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) 

Nota - devo aggiungere una nota che se l'utente assegna troppi processi, allora l'utente può ottenere questo errore: Error in serialize(data, node$con) : error writing to connection

Nota - Se .combine nell'istruzione foreach è rbind, l'oggetto finale restituito sarebbe stato creato aggiungendo l'output di ogni ciclo in termini di righe.

Spero che questo sia utile per le persone che provano l'elaborazione parallela in R per la prima volta come me.

Riferimenti: 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/