2012-09-02 15 views
5

Sto provando a parallelizzare (usando snow::parLapply) un codice che dipende da un pacchetto (ad esempio un pacchetto diverso da snow). Gli oggetti a cui si fa riferimento nella funzione chiamata da parLapply devono essere passati esplicitamente al cluster utilizzando clusterExport. Esiste un modo per passare un intero pacchetto al cluster anziché dover denominare esplicitamente ogni funzione (incluse le funzioni interne di un pacchetto chiamate dalle funzioni utente!) In clusterExport?Passaggio di un intero pacchetto a un cluster di neve

risposta

6

Installare il pacchetto su tutti i nodi, e hanno la chiamata codice library(thePackageYouUse) su tutti i nodi attraverso uno dei comandi disponibili, l'uovo qualcosa come

clusterApply(cl, library(thePackageYouUse)) 

Credo che il pacchetto parallel che viene fornito con le recenti versioni R ha esempi - - si veda ad esempio qui dal help(clusterApply) in cui il pacchetto viene caricato boot ovunque:

## 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

Grazie Dirk. Ci sono motivi per cui 'clusterExport (ls())' sarebbe pericoloso? Ciò non aiuterebbe con il passaggio delle funzioni dai pacchetti ma farebbe risparmiare un sacco di mal di testa per parallelizzare rapidamente i loop (qualcuno non è mio!) Che si basano su una tonnellata di variabili globali. – Michael

+0

È solo un cattivo design in quanto utilizza un approccio scatter sparatutto più lavello. Progetta ciò che ti serve in una soluzione seriale, quindi rendilo parallelo. –

+0

Abbastanza onesto, grazie per l'aiuto. – Michael

Problemi correlati