我的挑战是并行计算递归函数。然而,递归是相当深的,因此(在我自己的新手中),当所有工作人员都忙时,分配工作人员存在问题。简而言之,它会粉碎。
这是一些可重现的代码。代码非常愚蠢,但结构才算重要。这是正在发生的事情的简化版本。
我在Windows机器上工作,如果解决方案是linux,只需说出来。因为实际功能可能非常深,所以管理上层要求的工作人员数量将无法解决问题。有没有办法知道递归的级别是什么?
FUN <- function(optimizer,neighbors,considered,x){
considered <- c(considered,optimizer)
neighbors <- setdiff(x=neighbors,y=considered)
if (length(neighbors)==0) {
# this loop is STUPID, but it is just an example.
z <- numeric(10)
for (i in 1:100)
{
z[i] <- sample(x,1)
}
return(max(z))
} else {
# Something embarrassingly parallel,
# but cannot be vectorized.
z <- numeric(10)
z <- foreach(i=1:10, .combine='c') %dopar%{
FUN(optimizer=neighbors[1],neighbors=neighbors,
considered=considered,x=x)}
return(max(z))
}
}
require(doParallel,quietly=T)
cl <- makeCluster(3)
clusterExport(cl, c("FUN"))
registerDoParallel(cl)
getDoParWorkers()
>FUN(optimizer=1,neighbors=c(2),considered=c(),x=1:500)
[1] 500
>FUN(optimizer=1,neighbors=c(2,3),considered=c(),x=1:500)
Error in { : task 1 failed - "could not find function "%dopar%""
答案 0 :(得分:3)
>FUN(optimizer=1,neighbors=c(2,3),considered=c(),x=1:500)
Error in { : task 1 failed - "could not find function "%dopar%""
这个错误真的是因为递归太深或仅仅是因为你的require(doParallel)
函数中没有FUN
吗?因此,当在worker上调用FUN
时,该R实例的列表中没有该包。
你的第一个例子没有这样做,因为它很简单,无法进入内部%dopar%
循环。