2012-09-02 8 views
5

私は、パッケージに依存するコード(snow以外)を並列化しようとしています(snow::parLapplyを使用しています)。 parLapplyによって呼び出される関数で参照されるオブジェクトは、clusterExportを使用して明示的にクラスタに渡す必要があります。 clusterExportにすべての関数(パッケージの内部関数をユーザー関数から呼び出すことを含む)を明示的に指定する必要はなく、パッケージ全体をクラスターに渡す方法はありますか?パッケージ全体をスノークラスタに渡す

答えて

6

は、

clusterApply(cl, library(thePackageYouUse)) 

私は、最近のRのリリースに付属している例がありparallelパッケージを考えるような卵のものをすべてのノードにパッケージをインストールし、一方を介して利用可能なコマンドをすべてのノード上のコードの呼び出しlibrary(thePackageYouUse)を持っています -

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

おかげディルク: - bootパッケージはどこにでもロードされているhelp(clusterApply)から、ここでの例を参照。 'clusterExport(ls())'を実行するのが危険な理由はありますか?これはパッケージから関数を渡すのには役立ちませんが、大量のグローバル変数に依存するループ(誰かのelses、私のものではありません! – Michael

+0

それは、スキャターショットとキッチンシンクのアプローチを使用するという点で、ちょうど悪いデザインです。シリアルソリューションで必要なものを設計し、それをパラレルにします。 –

+0

十分に公正な、助けをありがとう。 – Michael

関連する問題