2012-09-02 17 views
5

Estoy tratando de paralelizar (usando snow::parLapply) algún código que depende de un paquete (es decir, un paquete que no sea snow). Los objetos a los que se hace referencia en la función llamada por parLapply se deben pasar explícitamente al clúster utilizando clusterExport. ¿Hay alguna forma de pasar un paquete completo al clúster en lugar de tener que nombrar explícitamente todas las funciones (incluidas las funciones internas de un paquete llamadas por las funciones del usuario) en clusterExport?Pasar un paquete completo a un grupo de nieve

Respuesta

6

instalar el paquete en todos los nodos, y tener su código de llamada library(thePackageYouUse) en todos los nodos a través de uno de los comandos disponibles, huevo algo así como

clusterApply(cl, library(thePackageYouUse)) 

Creo que el paquete parallel que viene con las versiones R recientes tiene ejemplos - - véase, por ejemplo aquí desde help(clusterApply) donde el paquete boot se carga en todas partes:

## A bootstrapping example, which can be done in many ways: 
clusterEvalQ(cl, { 
    ## set up each worker. Could also use clusterExport() 
    library(boot) 
    cd4.rg <- function(data, mle) MASS::mvrnorm(nrow(data), mle$m, mle$v) 
    cd4.mle <- list(m = colMeans(cd4), v = var(cd4)) 
    NULL 
}) 
+1

Gracias Dirk. ¿Hay alguna razón por la cual hacer 'clusterExport (ls())' sería peligroso? Esto no ayudaría a pasar las funciones de los paquetes, pero ahorraría muchos dolores de cabeza para paralelizar rápidamente los bucles (¡alguien más, no el mío!) Que dependen de una tonelada de variables globales. – Michael

+0

Es solo un mal diseño, ya que utiliza un enfoque scattershot plus sink de cocina. Diseña lo que necesitas en una solución en serie, luego haz que sea paralelo. –

+0

Bastante, gracias por la ayuda. – Michael

Cuestiones relacionadas