在R中使用foreach会占用内存使用量

时间:2014-04-13 23:08:11

标签: r foreach multicore

我在Ubuntu发行版中使用R 2.15。

我正在应用一项功能,将关键字分配给来自热门社交网站的流式文本数据。我的目标是通过将数据分成两部分然后应用函数来提高处理效率:

textd<-data.frame(text=c("they","dont","think","it","be","like it is", "but it do"),keywordID=0)

textd<-split(textd, seq(nrow(textd)) %/% 2 %% 2 == 0)
keywords<-data.frame(kwds=c("be","do","is"),keywordID=1:3)

library(doParallel)
registerDoParallel(2)
library(foreach)


textd<-foreach (j = 1:2)%dopar%{
  t<-textd[[j]]

  for (i in keywords$kwds){    #for loop to assign keyword IDs

    tmp<-grepl(i, t$text, ignore.case = T)
    cond<-tmp & t$keywordID==0
    if (length(t$keywordID[cond]) > 0){
      t$keywordID[cond]<-keywords$keywordID[keywords$kwds==i]

      #if kw field is already populated...
      cond2<-tmp & t$keywordID!=0
      extra<-t[cond2,]
      if (length(extra$keywordID) > 0){
        extra$keywordID<-keywords$keywordID[keywords$kwds==i]

        t<-rbind(t,extra)}}
  }
  t
}


library(data.table)
textd<-as.data.frame(data.table::rbindlist(textd))

问题是,这样做会使两个内核使用相同数量的RAM,这意味着每个内核都会减少使用的内存量。它快速耗尽。我究竟做错了什么?如何让RAM在核心之间分配数量?谢谢你的期待。

1 个答案:

答案 0 :(得分:0)

尝试在循环中拆分数据。像这样:

library(itertools)
registerDoParallel(2)


textd<-foreach (t=isplitRows(textd, chunks=2), .combine=rbind,)%dopar%{ 

for (i in keywords$kwds){    #for loop to assign keyword IDs

tmp<-grepl(i, t$text, ignore.case = T)
cond<-tmp & t$keywordID==0
if (length(t$keywordID[cond]) > 0){
  t$keywordID[cond]<-keywords$keywordID[keywords$kwds==i]

  #if kw field is already populated...
  cond2<-tmp & t$keywordID!=0
  extra<-t[cond2,]
  if (length(extra$keywordID) > 0){
    extra$keywordID<-keywords$keywordID[keywords$kwds==i]

    t<-rbind(t,extra)}}
  }
 return(t)
 }