2011-10-04 21 views
5

¿Hay alguna forma de inicializar un clúster doSMP similar a clusterEvalQ y clusterExport en el paquete de nieve? Por ejemplo:¿Cómo se pueden inicializar los trabajadores 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()) 

hay una opción initEnvir a doSMP, pero ?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. 

Cada trabajador necesita una copia de varios objetos de gran tamaño con el fin de ejecutar la expresión lanzo foreach. Además, necesito llamar al foreach varios cientos de veces, con versiones idénticas de estos objetos grandes. Sería ineficiente copiar estos objetos para cada llamada al foreach.

Incluso si no hay una forma preconfigurada para hacer esto, agradecería un poco.

+0

pensé que no había acceso al entorno de base, que negaría la necesidad de copiar. ¿O me estoy perdiendo algo? – Iterator

+2

Simplemente curiosidad por qué estás implementando con doSMP en lugar de nieve? He encontrado que la nieve es más estable y portátil. – darckeen

+0

@darckeen: no estoy _sólo_ implementando con doSMP. Estoy creando opciones para que los usuarios empleen cualquier servidor de respaldo que elijan, incluido doSMP. –

Respuesta

1

El primer argumento para foreach es ... que transporta los objetos iterados para la evaluación de la expresión de destino. Si solo necesita una parte del objeto, puede ser más eficiente usar iter para pasar solo partes de un objeto.

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

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

Los objetos en el entorno de las tarjetas están todavía disponibles:

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

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

Su último ejemplo es el más cercano a lo que estoy tratando de hacer, excepto que 'zed' es varios cientos de MB, y ese ejemplo se ejecutará varios cientos o miles de veces durante la optimización de un algoritmo genético. Copiar 'zed' para cada una de las llamadas de cientos de miles' foreach' será costoso. –

0

Prueba esto:

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

O usted podría utilizar doSNOW y

registerDoSNOW(cl) 

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

Por último, hay DOMC (no para las ventanas)

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

Todos estos tec Las hniques funcionan antes del nuevo paquete paralelo en 2.14, que creo que ha logrado cierta unificación de estas técnicas.

+0

Esto no responde mi pregunta. Necesito copiar objetos a los trabajadores antes de llamar a 'foreach'. Sé sobre los otros backends, pero necesito una solución para 'doSMP' (ver mi comentario). –

Cuestiones relacionadas