doParallel与自己创建的函数

时间:2017-06-21 20:30:59

标签: r

我在R中创建了一个顺序模拟,迭代一个进程10,0000次。这需要大约70分钟,所以我决定尝试与doParallel包同时进行相同的操作。

我的foreach循环调用一个名为' inv.predict'的函数。这不在任何现有的包中。当我运行代码时出现错误。

cl <- makeCluster(4)
registerDoParallel(cl)
ptm <- proc.time()
clupeaformis_cr <- foreach(i = 1:100, .packages = c("spider", "investr", "mgcv")) %dopar% {
clupeaformis_cr <- rep(NA,  i)
clupeaformis_haplo_rand <- haploAccum(clupeaformis_aligned, method = "random", permutations = 1000) 

N <- clupeaformis_haplo_rand$sequences
H <- clupeaformis_haplo_rand$n.haplotypes
d <- data.frame(N, H)

clupeaformis_cr <- gam(H ~ s(N, bs = "cr", k = 20), optimizer = c("outer", "bfgs"), data = d)
clupeaformis_cr[i] <- inv.predict(clupeaformis_cr, y = 21, x.name = "N", interval = TRUE, 
               lower = 1, upper = 1000000)      
}

proc.time() - ptm
stopCluster(cl)


Error in { : 
   task 1 failed - "no applicable method for 'inv.predict' applied to an object of class "c('gam', 'glm', 'lm')""

我不确定为什么这并不是并行工作,而是在常规for循环中。这个问题与我昨天发布的另一个问题有关。

热烈欢迎任何帮助。

1 个答案:

答案 0 :(得分:0)

我找到了解决方案。

一般解决方案如下:

cl <- makeCluster(4) # set number of cluster/cores for parallelization 
registerDoParallel(cl) # register clusters

ptm <- proc.time() # start timer

my_function <- foreach(i = 1:1000, .packages = c(...)) %dopar% { # foreach loop

my_vec <- rep(NA,  i) # preallocate results to a empty vector

cl <- makeCluster(detectCores() - 1) # set number of cluster/cores for parallelization 
registerDoParallel(cl) # register clusters

my_vec[i] <- YOUR CODE HERE # filled vector with results

}

proc.time() - ptm # stop timer

stopCluster(cl)

请记住,如果有太多工作人员(群集/核心)同时进行通信,并行运行实际上可能会降低工作流程的速度。