2012-05-21 6 views
6

Soy nuevo en el uso de paquetes paralelos y he comenzado a explorarlos en un intento de acelerar algo de mi trabajo. Una molestia que encuentro a menudo es que el comando foreach arrojará problemas cuando no tenga clusterExport las funciones/variables relevantes.Saber qué objetos agrupar Exportar de antemano

Ejemplo

Sé que el ejemplo siguiente no necesita necesariamente foreach para que sea rápido, pero por el bien ilustración, lo usaré.

library(doParallel) 
library(parallel) 
library(lubridate) 
library(foreach) 

cl <- makeCluster(c("localhost", "localhost", "localhost","localhost"), type = "SOCK") 
registerDoParallel(cl, cores = 4) 

Dates <- sample(c(dates = format(seq(ISOdate(2010,1,1), by='day', length=365), format='%d-%m-%Y')), 500, replace = TRUE) 

foreach(i = seq_along(Dates), .combine = rbind) %dopar% dmy(Dates[i]) 

Error in dmy(Dates[i]) : task 1 failed - "could not find function "dmy"" 

Como se puede ver, no es un error que dice que la función dmy no se encuentra. entonces tengo que seguir y agregar lo siguiente:

clusterExport(cl, c("dmy")) 

Así que mi pregunta es, además de buscar en el error en busca de pistas sobre qué exportar, hay una manera más elegante de saber de antemano lo que se opone a exportar o es Hay una manera de compartir el entorno global con todos los esclavos antes de ejecutar el foreach?

+0

Hay un argumento '.packages' para eso. –

+0

¿Te importaría elaborar? Intenté (.packages()) y enumeré los paquetes adjuntos. Pero, ¿cómo exporto todos los objetos de un paquete? Probé clusterExport (cl, c ("library (lubridate)")) y clusterExport (cl, c ("lubridate")) en vano – JackeJR

+0

Lo siento, quise decir el argumento '.packages' para' foreach', no ' función de .packages' –

Respuesta

2

No es necesario exportar manualmente las funciones de paquetes individuales así. Puede usar el argumento .packages en la función foreach para cargar los paquetes necesarios, de modo que todas las funciones del paquete estarán disponibles para su expresión %dopar%.

+1

Esto funciona para la nueva biblioteca paralela en 2.14.0, p. parLapply? Estoy teniendo un problema similar. –

+2

@ mindless.panda: Debería poder usar 'clusterEvalQ (cl, library (packageName))' para cargar paquetes en cada nodo del clúster. –

+0

Gracias, también acabo de colocar una 'library (packagename)' dentro de la función anónima en el parLapply. –

Cuestiones relacionadas