我在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循环中。这个问题与我昨天发布的另一个问题有关。
热烈欢迎任何帮助。
答案 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)
请记住,如果有太多工作人员(群集/核心)同时进行通信,并行运行实际上可能会降低工作流程的速度。