2011-10-04 15 views
5

C'è un modo per inizializzare un cluster doSMP simile a clusterEvalQ e clusterExport nel pacchetto neve? Per esempio:Come è possibile inizializzare i lavoratori con doSMP?

x <- 1:10 
y <- 10:1 
z <- rnorm(10) 
cl <- makeSOCKcluster(2) 
clusterEvalQ(cl, library(quantmod)) 
clusterExport(cl, list("x","y","z")) 
clusterEvalQ(cl, ls()) 
clusterEvalQ(cl, search()) 

C'è un'opzione initEnvir a doSMP, ma ?doSMP dice

‘initEnvir’ is a function to be executed by each worker before any 
tasks are executed associated with a foreach. Its purpose is to 
initialize the execution environment, or the worker in general. 
It is only executed by a worker if that worker executes at least 
one task associated with the foreach. 

Ciascun lavoratore ha bisogno di una copia di diversi oggetti di grandi dimensioni al fine di eseguire l'espressione mando a foreach. Inoltre, ho bisogno di chiamare foreach diverse centinaia di volte, con versioni identiche di questi oggetti di grandi dimensioni. Sarebbe inefficiente copiare questi oggetti per ogni chiamata a foreach.

Anche se non c'è un modo pronto per farlo, apprezzerei un kludge.

+0

ho pensato che ci fosse l'accesso all'ambiente di base, che sarebbe negare la necessità di copiare. O mi sta sfuggendo qualcosa? – Iterator

+2

Solo curioso perché stai implementando con doSMP invece di neve? Ho trovato la neve più stabile e portatile. – darckeen

+0

@darckeen: Non sto solo implementando con doSMP. Sto creando opzioni per gli utenti di utilizzare qualsiasi back-end foreach che scelgono, incluso doSMP. –

risposta

1

Il primo argomento a foreach è ... che trasporta gli oggetti iterati per la valutazione dell'espressione di destinazione. Se è necessaria solo una parte dell'oggetto, potrebbe essere più efficiente utilizzare iter per passare solo parti di un oggetto.

w <- startWorkers(workerCount = 4) 
registerDoSMP(w) 

foreach(x=iter(x),y=iter(y),z=iter(z)) %dopar% (x*y*z) 

Gli oggetti nell'ambiente chiamante sono ancora disponibili:

foreach(1:10) %dopar% (x*y*z) # Somewhat repetitious # 

zed <- 20:1 
foreach(x=iter(x)) %dopar% (x*zed) 
+0

Il tuo ultimo esempio è il più vicino a quello che sto cercando di fare, tranne che 'zed' è di diverse centinaia di MB, e quell'esempio verrà eseguito diverse centinaia o migliaia di volte durante l'ottimizzazione dell'algoritmo genetico. Copiare "zed" per ognuna delle diverse centinaia/migliaia di chiamate "foreach" sarà costoso. –

0

Prova questo:

library(doSMP) 
library(foreach) 
w <- startWorkers(workerCount = 4) 
registerDoSMP(w) 
foreach(i = 1:3) %dopar% sqrt(i) 

Oppure si potrebbe usare doSNOW e

registerDoSNOW(cl) 

http://cran.r-project.org/web/packages/doSNOW/doSNOW.pdf

Infine, c'è domc (non per le finestre)

library(doMC) 
registerDoMC() 
foreach(i = 1:3) %dopar% sqrt(i) 

Tutto questi tec gli hniques lavorano prima del nuovo pacchetto parallelo in 2.14, che credo abbia fatto unificazione di queste tecniche.

+0

Questo non risponde alla mia domanda. Ho bisogno di copiare gli oggetti sui lavoratori prima di chiamare 'foreach'. Conosco gli altri backend, ma ho bisogno di una soluzione per 'doSMP' (vedi il mio commento). –

Problemi correlati