2012-09-02 5 views
5

Ich versuche parallel (mit snow::parLapply) einige Code, der auf einem Paket (dh ein anderes Paket als snow) abhängt. Objekte, die in der von parLapply aufgerufenen Funktion referenziert werden, müssen explizit an den Cluster übergeben werden, indem clusterExport verwendet wird. Gibt es eine Möglichkeit, ein ganzes Paket an den Cluster zu übergeben, anstatt jede Funktion (einschließlich der internen Funktionen eines Pakets, die von Benutzerfunktionen aufgerufen werden) explizit in clusterExport zu benennen?Ein ganzes Paket an einen Schnee-Cluster übergeben

Antwort

6

Installieren Sie das Paket auf allen Knoten und Ihre Coderuf haben library(thePackageYouUse) auf allen Knoten über einen der verfügbaren Befehle, Ei so etwas wie

clusterApply(cl, library(thePackageYouUse)) 

Ich denke, die parallel-Paket, das mit den jüngsten R Releases kommt, hat Beispiele - siehe zum Beispiel hier von help(clusterApply) wo das boot Paket überall geladen wird -:

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

Danke Dirk. Gibt es irgendwelche Gründe, warum 'clusterExport (ls())' gefährlich wäre? Dies würde nicht helfen, Funktionen von Paketen zu übergeben, aber es würde eine Menge Kopfzerbrechen bereiten, um for-Schleifen (jemand enses, nicht meins!) Schnell zu parallelisieren, die auf einer Tonne globaler Variablen beruhen. – Michael

+0

Es ist nur schlechtes Design, dass es eine Scattershot plus Küchenspüle Ansatz verwendet. Entwerfen Sie, was Sie in einer seriellen Lösung benötigen, und machen Sie es parallel. –

+0

Schön genug, danke für die Hilfe. – Michael

Verwandte Themen