从并行for循环返回结果

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了从并行for循环返回结果相关的知识,希望对你有一定的参考价值。

我想模拟数据,同时对这些数据进行10000次分析。因此我在R中使用了“for”循环来重复工作10000次。现在我想并行化这个任务。我遵循以下代码:

library(parallel)
library(doSNOW)
cl <- makeSOCKcluster(3)
registerDoSNOW(cl)

progress <- function(n) cat(sprintf("task %d is complete
", n)) # to check the progress of the work

setno<- data.frame(sample_no=c(1:10000))
no_of_samples<- unique(setno$sample_no)

simulated_data_list <- vector("list",length(no_of_samples))
analysis_result <-  numeric(length(simulated_data_list ))

foreach(i=1:10000,progress)%dopar%{
 tryCatch({
 simulated_data_list[[i]]<-  rnorm(100)# suppose we are simulating data 
 analysis_result[[i]] <-  1-pnorm(simulated_data_list[[i]][1])
 },error=function(e){cat("ERROR:",conditionMessage(e),"
")})
}

但每次我这样做,我发现该程序不是模拟数据(程序代码没有问题,因为它没有并行化正常运行)。我无法理解上面代码中的问题在哪里。你能建议更好的方法来做这项工作吗?

答案

你必须从return循环foreach结果。例如:

library(parallel)
library(doSNOW)
cl <- makeSOCKcluster(3)
registerDoSNOW(cl)

result <- foreach(i = 1:5) %dopar% {
    sim <- rnorm(2)
    list(sim , 1 - pnorm(sim[1]))
}
simulated_data_list <- lapply(result, "[[", 1)
analysis_result <- lapply(result, "[[", 2)

例如,使用简单的for我们可以附加到列表,但foreach不能像这样工作:

dummyList <- list()
dummyList2 <- list()
foreach(i = 1:5) %dopar% {
    dummyList[[i]] <- rnorm(2)
}
for(i in 1:5) {
    dummyList2[[i]] <- rnorm(2)
}
lapply(list(dummyList, dummyList2), length)

[[1]]
[1] 0
[[2]]
[1] 5

以上是关于从并行for循环返回结果的主要内容,如果未能解决你的问题,请参考以下文章

如何在Django视图中使用for循环返回每次迭代[关闭]

以追加到列表为结果的多处理 for 循环

如何使用CUDA并行化嵌套for循环以在2D数组上执行计算

使用 OpenMP 在 C、C++ 中并行化嵌套 for 循环的几种方法之间的区别

使用 CUDA 在 python 中展开一个可并行化的 for 循环

在 Activity 内部,如何暂停 for 循环以调用片段,然后在按钮单击片段后恢复循环以重新开始