首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何将biglm与doMC和foreach一起使用

如何将biglm与doMC和foreach一起使用
EN

Stack Overflow用户
提问于 2013-05-16 07:44:00
回答 1查看 493关注 0票数 2

可以在并行模式下运行biglm吗?我尝试使用doMC,然后在foreach循环中嵌入biglm,但似乎所有内核都将同时处理相同的数据块。我如何将其并行化?

代码语言:javascript
复制
library(doMC)
RegisterDoMC(4)

require(ffbase)
sample <- read.table.ffdf(file="sample_output.csv", FUN = "read.csv", na.strings = "")  
library(biglm)
model<-list()
biglmupdate<-function(dataset,start,end) {
 if (start==1) {
    model <<- biglm(a~b+c, data=dataset[start:end,])
 }
 else {
    model <<- update(model,dataset[start:end,])
 }
}

chunks <- floor(dim(sample)[1]/220000)+1
start<-0; end<-0;
foreach (i = 1: chunks) %dopar% { 
    start = end +1; end =ifelse (i == chunks, dim(sample)[1], start+220000); 
    print(paste("chunk ",i," ",start,":",end," started at:", Sys.time()));
    biglmupdate(dataset = sample, start, end);
    print(paste("chunk ",i,"ended at:", Sys.time()));
}
EN

回答 1

Stack Overflow用户

发布于 2013-05-17 19:56:34

我不太熟悉biglm包,但它似乎不容易并行执行,因为它是通过一系列对模型对象的更新来工作的。这种类型的循环基本上是顺序的。例如,您不能并行化:

代码语言:javascript
复制
i <- 0
for (i in 1:10) {
    i <- i + 1
}

通过让10个不同的进程分别向i添加1。该循环依赖于对i进行顺序更新。在我看来,biglm函数也是如此。

除了这个基本问题之外,我还看到了代码中的另外两个问题:startend的计算,以及修改model的方式。与我上面的例子一样,当循环并行执行时,您不能根据以前迭代的值来计算循环变量的值。在这种情况下,可以通过将循环更改为以下内容来解决此问题:

代码语言:javascript
复制
n <- nrow(sample)
m <- 220000
foreach(start=seq(1,n,by=m), end=seq(m,n,by=m) %dopar% {
    # ...
}

startend的值都是预先计算的,因此并行执行循环是没有问题的。我怀疑这解决了导致您评论所有内核都在处理同一块数据的问题。不幸的是,这并没有解决并行执行biglm的根本问题。

model的问题在于,您试图从并行进程中更新单个类似全局的变量。在使用foreach时,您应该考虑从循环的每次迭代中返回一个值,并使用.combine函数处理它们。让body在循环外部修改变量几乎总是失败的。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16576783

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档