【问题标题】:Return result from a parallelized for loop从并行化的 for 循环返回结果
【发布时间】:2018-11-06 04:35:30
【问题描述】:

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

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

progress <- function(n) cat(sprintf("task %d is complete\n", 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),"\n")})
}

但是每次我这样做时,我发现程序没有模拟数据(程序代码没有问题,因为它正常运行而没有并行化)。我不明白上面代码中的问题出在哪里。您能建议任何更好的方法来完成这项工作吗?

【问题讨论】:

  • 1.您的代码不可重现simulated_data_list[[i]]&lt;- some function to simulate data ; 2. 你在模拟中使用种子吗? 3. 我会使用future 而不是doSNOW
  • @PoGibas 我把它做成可重现的。您现在可以建议吗?
  • 你的意思是“程序代码没有问题,因为它在没有并行化的情况下正常运行”使用foreach和简单的%do%更新simulated_data_listanalysis_result
  • @PoGibas 没有 foreach 和 %do%
  • 是的,没错!这是foreach 返回结果的方式,它使用return 并且不能简单地附加到提供的列表中。从foreach 返回单个列表:list(sim &lt;- rnorm(100); 1-pnorm(sim))

标签: r foreach parallel.foreach


【解决方案1】:

您必须 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

【讨论】:

  • 非常感谢。我明白。不知何故,我自己的代码无法正常工作。但无论如何,会检查它。
  • @F.Privé 他的解决方案是正确的。我的代码中有一些问题。我修好了。:)
猜你喜欢
  • 2017-09-30
  • 1970-01-01
  • 2018-06-05
  • 1970-01-01
  • 2019-09-16
  • 1970-01-01
  • 1970-01-01
  • 2014-04-03
  • 1970-01-01
相关资源
最近更新 更多