【问题标题】:Foreach code works for %do% but not for %dopar%Foreach 代码适用于 %do% 但不适用于 %dopar%
【发布时间】:2016-05-20 00:29:24
【问题描述】:

这在我的电脑上正常工作:

registerDoSNOW(makeCluster(2, type = "SOCK"))

foreach(i = 1:M,.combine = "c") %dopar% {

  sum(rnorm(M))
  }

所以我可以说我可以在这台计算机上运行并行代码,对吧?

好的。我有一段代码希望与 foreach 并行运行。当它用 %do% 编写时它运行完美,但当我将它更改为 %dopar% 时它不能正常工作。 (PS:我已经用registerDoSNOW(makeCluster(2, type = "SOCK"))初始化了集群,方法和之前一样。)

我对代码的主要兴趣是获取向量u.varpred。我用 %do% 很好地得到了它,但是当我用 %dopar% 运行它时,向量是一个 NULL。

这是正确运行所需代码的循环。它使用 geoR 包中的函数。

#you can pretty much ignore all this, it's just preparation for the loop
N=20
NN=10 

set.seed(111);
datap <- grf(N, cov.pars=c(20, 5),nug=1) 

grid.o <- expand.grid(seq(0, 1, l=100), seq(0, 1, l=100))
grid.c <- expand.grid(seq(0, 1, l=NN), seq(0,1, l=NN)) 

beta1=mean(datap$data)
emv<- likfit(datap, ini=c(10,0.4), nug=1) 
krieging <- krige.conv(datap, loc=grid.o,
                       krige=krige.control(type.krige="SK", trend.d="cte",
                                           beta =beta1, cov.pars=emv$cov.pars))



names(grid.c) = names(as.data.frame(datap$coords))
list.geodatas<-list()
valores<-c(datap$data,0)
list.dataframes<-list()

list.krigings<-list(); i=0; u.varpred=NULL;

#here is the foreach code
t<-proc.time()
foreach(i=1:length(grid.c[,1]), .packages='geoR') %do% {
  list.dataframes[[i]] <- rbind(datap$coords,grid.c[i,]);
  list.geodatas[[i]] <- as.geodata(data.frame(cbind(list.dataframes[[i]],valores)))
  list.krigings[[i]] <- krige.conv(list.geodatas[[i]], loc=grid.o,
                                   krige=krige.control(type.krige="SK", trend.d="cte",
                                                       beta =beta1, cov.pars=emv$cov.pars));
  u.varpred[i] <- mean(krieging$krige.var - list.krigings[[i]]$krige.var)
  list.dataframes[[i]]<-0 #i dont need those objects anymore but since they
  # are lists i dont want to put <-NULL as it'll ruin their ordering
  list.krigings[[i]]<- 0 
  list.geodatas[[i]] <-0
}
t<-proc.time()-t
t

您可以检查它是否运行良好(前提是您有以下软件包:geoRforeachdoSNOW)。但是一旦我使用了registerDoSNOW(......)%dopar%u.varpred 就会变成 NULL。

请大家看看我是不是在 foreach 语句/过程中犯了错误,还是只是代码不能并行? (我认为可以,因为任何给定的迭代都不依赖于它之前的任何迭代..)

很抱歉,代码和这个问题都太长了。提前感谢您抽出宝贵时间阅读。

【问题讨论】:

    标签: r foreach


    【解决方案1】:

    我的朋友直接帮助了我。这是它的一种工作方式:

        u.varpred <- foreach(i = 1:length(grid.c[,1]), .packages = 'geoR', .combine = "c") %dopar% {
      list.dataframes[[i]] <- rbind(datap$coords,grid.c[i,]);
      list.geodatas[[i]] <- as.geodata(data.frame(cbind(list.dataframes[[i]],valores)));
      list.krigings[[i]] <- krige.conv(list.geodatas[[i]], loc = grid.o,
                            krige = krige.control(type.krige = "SK", trend.d = "cte",
                            beta = beta1, cov.pars = emv$cov.pars));
      u.varpred <- mean(krieging$krige.var - list.krigings[[i]]$krige.var);
      list.dataframes[[i]] <- 0; 
      list.krigings[[i]] <- 0;
      list.geodatas[[i]] <- 0;
      u.varpred #this makes the results go into u.varpred
    }
    

    他举了一个例子说明为什么这样做:

    a <- NULL
    foreach(i = 1:10) %dopar% {
      a <- 5
    }
    print(a)
    # a is still NULL
    
    a <- NULL
    a <- foreach(i = 1:10) %dopar% {
      a <- 5
      a
    }
    print(a)
    #now it works
    

    希望这对任何人都有帮助。

    【讨论】:

      猜你喜欢
      • 2020-06-14
      • 2011-10-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-10-27
      • 2020-08-03
      相关资源
      最近更新 更多