繁体   English   中英

Foreach代码适用于%do%,但不适用于%dopar%

[英]Foreach code works for %do% but not for %dopar%

这在我的计算机上正常工作:

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语句/过程中是否犯了一个错误,或者仅仅是代码不能并行化吗? (我认为可以,因为任何给定的迭代都不会依赖于它之前的任何迭代。)

很抱歉,代码和这个问题都这么长。 在此先感谢您抽出宝贵的时间阅读本书。

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

    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

希望这对任何人有帮助。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM