mja*_*iec 20 parallel-processing r
从optim调用包含foreach%dopar%构造的函数会导致错误:
> workers <- startWorkers(6) # 6 cores
>
> registerDoSMP(workers)
>
> t0 <- Sys.time()
>
> optim(w,maxProb2,control=list(fnscale=-1))
>
> Error in { : task 1 failed - "unused argument(s) (isPrebuilt = TRUE)"
>
> Sys.time()-t0
>
> Time difference of 2.032 secs
>
> stopWorkers(workers)
Run Code Online (Sandbox Code Playgroud)
被调用的函数看起来像这样:
> maxProb2 <- function(wp) {
>
> r <- foreach (i=s0:s1, .combine=c) %dopar% { pf(i,x[i,5],wp,isPrebuilt=TRUE) }
>
> cat("w=",wp,"max=",sum(r),"\n")
>
> sum(r)
>
> }
Run Code Online (Sandbox Code Playgroud)
pf是一些其他函数,x是预先计算元素的静态表.
同样调用要优化的函数只会导致同样的错误:
> workers <- startWorkers(6) # 6 cores
>
> Warning message:
> In startWorkers(6) : there is an existing doSMP session using doSMP1
>
> registerDoSMP(workers)
>
> maxProb2(w)
> Error in { : task 1 failed - "unused argument(s) (isPrebuilt = TRUE)"
>
> stopWorkers(workers)
Run Code Online (Sandbox Code Playgroud)
奇怪的是,相同的代码在一次直接调用时工作正常(optim会多次调用相同的函数):
> workers <- startWorkers(6) # 6 - ilosc rdzeni
>
> Warning message:
> In startWorkers(6) : there is an existing doSMP session using doSMP1
>
> registerDoSMP(workers)
>
> r <- foreach (i=s0:s1, .combine=c) %dopar% { pf(i,x[i,5],w,isPrebuilt=TRUE) }
>
> sum(r)
> [1] 187.1781
>
> stopWorkers(workers)
Run Code Online (Sandbox Code Playgroud)
当使用%do%而不是%dopar%时,被调用函数(maxProb2)工作正常.
如何才能正确调用包含foreach%dopar%构造的函数?
更新2011-07-17:
我已将pf函数重命名为probf,但问题仍然存在.
probf函数在脚本中定义,而不是在某些外部包中定义.
两个注意事项:操作系统:Windows 7,IDE:Revolution Analytics Enterprise 4.3
> workers <- startWorkers(workerCount = 3)
>
> registerDoSMP(workers)
>
> maxProb2(w)
>
Error in { : task 1 failed - "could not find function "probf""
Run Code Online (Sandbox Code Playgroud)
Max*_*don 22
我遇到了同样的问题,问题是环境没有包含在子线程中.你的错误
{:任务1失败 - "找不到函数"错误simple_fn""
可以通过这个非常简单的例子再现:
simple_fn <- function(x)
x+1
test_par <- function(){
library("parallel")
no_cores <- detectCores()
library("foreach")
cl<-makeCluster(no_cores)
library("doSNOW")
registerDoSNOW(cl)
out <- foreach(i=1:10) %dopar% {
simple_fn(i)
}
stopCluster(cl)
return(out)
}
test_par()
Run Code Online (Sandbox Code Playgroud)
现在您需要做的就是改变foreach(i=1:10)
成foreach(i=1:10, .export=c("simple_fn"))
.如果您想要导出完整的全球环境,那么只需写.export=ls(envir=globalenv())
一下即可,无论好坏.
[[编辑]]
您的pf
函数和“静态表”x
必须分发到所有工作节点。您必须阅读并行库的文档以了解其工作原理。
似乎当运行 optim 时,pf
它找到的函数是另一个函数(可能是stats::pf
,它没有isPrebuilt
参数)。
您可以尝试重命名您的pf
函数(例如重命名为mypf
)吗?
mypf <- pf # renaming the function
maxProb2 <- function(wp) {
r <- foreach (i=s0:s1, .combine=c) %dopar% { mypf(i,x[i,5],wp,isPrebuilt=TRUE) }
cat("w=",wp,"max=",sum(r),"\n")
sum(r)
}
Run Code Online (Sandbox Code Playgroud)
或者,如果您的pf
函数是具有名称空间的包的一部分(例如,mypackage
),您可以像这样引用它:mypackage::pf
maxProb2 <- function(wp) {
r <- foreach (i=s0:s1, .combine=c) %dopar% { mypackage::pf(i,x[i,5],wp,isPrebuilt=TRUE) }
cat("w=",wp,"max=",sum(r),"\n")
sum(r)
}
Run Code Online (Sandbox Code Playgroud)