下面只是一个玩具示例,用于代表可重现代码的问题,但我的数据和作用于数据的后续函数涉及更多,并且实际上将从并行运行中受益。
我遇到的问题是,下面的循环在 %do% 和 %dopar% 下都按预期运行,但是 %dopar% 相对于 %do% 非常慢。
我已经将问题缩小到我正在搜索一个非常大的列表,通过索引到子集然后对其进行处理来从该列表中获取数据。
有人可以提供有关如何改进 %dopar% 的见解吗?在我的实际数据中,我需要对已经存储在列表中的数据框进行子集化,然后将该 df 传递给 4 个不同的函数。
也很抱歉,我确实在 R-Help 上发布了这个问题,但在 Stack Exchange 上看到了更多关于 foreach 的活动。
N <- 200000
myList <- vector('list', N)
names(myList) <- 1:N
for(i in 1:N){
myList[[i]] <- rnorm(100)
}
nms <- 1:N
library(foreach)
library(doParallel)
registerDoParallel(cores=7)
result <- foreach(i = 1:3) %do% {
dat <- myList[[which(names(myList) == nms[i])]]
mean(dat)
}
result <- foreach(i = 1:3) %dopar% {
dat <- myList[[which(names(myList) == nms[i])]]
mean(dat)
}