【问题标题】:Using foreach in R doubles memory usage在 R 中使用 foreach 会使内存使用量翻倍
【发布时间】:2014-04-13 23:08:10
【问题描述】:

我在 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 数量会增加一倍。它很快就用完了。我究竟做错了什么?如何让 RAM 在内核之间分配数量?感谢观看。

【问题讨论】:

标签: r foreach multicore


【解决方案1】:

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

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)
 }

【讨论】:

    猜你喜欢
    • 2014-07-07
    • 1970-01-01
    • 1970-01-01
    • 2021-11-15
    • 1970-01-01
    • 1970-01-01
    • 2019-06-10
    • 2017-06-24
    • 1970-01-01
    相关资源
    最近更新 更多