【发布时间】: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
您可以检查它是否运行良好(前提是您有以下软件包:geoR、foreach 和 doSNOW)。但是一旦我使用了registerDoSNOW(......) 和%dopar%,u.varpred 就会变成 NULL。
请大家看看我是不是在 foreach 语句/过程中犯了错误,还是只是代码不能并行? (我认为可以,因为任何给定的迭代都不依赖于它之前的任何迭代..)
很抱歉,代码和这个问题都太长了。提前感谢您抽出宝贵时间阅读。
【问题讨论】: