[英]parallelize Own Package in R
正如在其他帖子中所建議的那樣,我在R中編寫了自己的程序包以並行化使用Rcpp編寫的函數。 我可以加載該程序包,並且一切正常,但是當我使用optimParallel時,會收到以下消息:
checkForRemoteErrors(val)中的錯誤:3個節點產生了錯誤; 第一個錯誤:找不到對象'_EffES_profileLLcpp'
這是我在做什么:
library(optimParallel)
library(EffES) # EffES is my own package
cl <- makeCluster(detectCores()-1)
clusterEvalQ(cl, library(EffES))
clusterEvalQ(cl, library(optimParallel))
setDefaultCluster(cl = cl)
w.es <- optimParallel(par=rep(0.001,3), profileLLcpp, y=y.test, x=x.test, lower = rep(0.001,3), method = "L-BFGS-B")$par
Error in checkForRemoteErrors(val) :
3 nodes produced errors; first error: object '_EffES_profileLLcpp' not found
我究竟做錯了什么?
您必須將對象'_EffES_profileLLcpp'
傳播到群集的每個核心。 您可以使用clusterExport
進行此操作:
clusterExport(cl,'_EffES_profileLLcpp')
對需要並行使用的每個對象重復此步驟(或者只是檢查哪個對象出現在錯誤日志中,並使用clusterExport
對其進行clusterExport
)。
希望這可以幫助
該版本在CRAN上可用: https ://CRAN.R-project.org/package=optimParallel
如后文所述, optimParallel()
需要一些技巧,以便對可以通過...
參數傳遞的參數名稱沒有限制。 當前,這意味着傳遞給optimParallel()
的函數必須在.GlobalEnv
中定義,以便正確查找已編譯的代碼。
因此,一種解決方法是在.GlobalEnv
定義函數:
library(optimParallel)
library(EffES) # EffES is your own package
cl <- makeCluster(detectCores()-1)
clusterEvalQ(cl, library(EffES))
setDefaultCluster(cl=cl)
f <- function(par, y, x) {
profileLLcpp(par=par, x=x, y=y)
}
optimParallel(par=rep(0.001,3), f=f, y=y.test, x=x.test,
lower = rep(0.001,3), method = "L-BFGS-B")$par
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.