2012-09-02 45 views
5

我嘗試(使用snow::parLapply)一些代碼依賴於一個包並行(即比snow其他包)。由parLapply調用該函數引用的對象必須明確地傳遞給使用clusterExport集羣。有沒有辦法通過整個包到集羣,而不是明確地命名每個函數(包括軟件包的用戶函數調用!內部函數)在clusterExport傳遞整個包雪集羣

回答

6

所有節點上安裝的軟件包,並有所有節點上的代碼調用library(thePackageYouUse)通過一個可用的命令,雞蛋像

clusterApply(cl, library(thePackageYouUse)) 

我覺得parallel包附帶R最近的版本有例子 - - 例如,從help(clusterApply)可以看出,這裏的boot包裝無處不在:

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

謝謝德克。有沒有什麼原因爲什麼做'clusterExport(ls())'會危險?這不會從包傳遞函數幫助,但它會節省很多頭痛的快速並行for循環(別人的,不是我的!),它依靠一噸的全局變量。 – Michael

+0

這只是糟糕的設計,因爲它使用scattershot plus廚房水槽方法。在串行解決方案中設計你需要的東西,然後使其平行。 –

+0

夠公平的,謝謝你的幫助。 – Michael