gpt4 book ai didi

r - doParallel 与自己创建的函数

转载 作者:行者123 更新时间:2023-12-01 06:01:47 27 4
gpt4 key购买 nike

我在 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 循环中工作。这个问题与我昨天发布的另一个问题有关。

任何帮助都受到热烈欢迎。

最佳答案

我已经找到了解决方案。

一般的解决方法如下:

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)

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

关于r - doParallel 与自己创建的函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44685755/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com