我在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在核心之间分配数量?谢谢你的期待。
答案 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)
}