2013-10-17 91 views
0

我有一個6GB的數據集,我想處理600萬條消息 - 我的目標是爲我的數據集創建一個文檔術語矩陣,但我需要做一些預處理(去除HTML標籤,詞幹,停止詞的刪除等)。在R中處理大文本文件

這裏是我當前如何試圖做到這一切:

library(data.table) 
library(tm) 

wordStem2 <- function(strings){ 
    sapply(lapply(strsplit(stripWhitespace(strings), " "), wordStem), function(x) paste(x, collapse=" ")) 
} 

load("data/train.RData") 
sampletrainDT <- as.data.table(train) 
rm(train) 
setkey(sampletrainDT, Id) 

object.size(sampletrainDT) # 5,632,195,744 bytes 

gc() 
sampletrainDT[, Body := tolower(Body)] 
object.size(sampletrainDT) # 5,631,997,712 bytes, but rsession usage is at 12 GB. gc doesn't help. 
gc() 
sampletrainDT[, Body := gsub("<(.|\n)*?>", " ", Body)] # remove HTML tags 
sampletrainDT[, Body := gsub("\n", " ", Body)] # remove \n 
sampletrainDT[, Body := removePunctuation(Body)] 
sampletrainDT[, Body := removeNumbers(Body)] 
sampletrainDT[, Body := removeWords(Body, stopwords("english"))] 
sampletrainDT[, Body := stripWhitespace(Body)] 
sampletrainDT[, Body := wordStem2(Body)] 

LS在每行:

ls() 
[1] "sampletrainDT" "wordStem2" 

sampletrainDT每一行是一個消息,主柱是Body。其他包含像docid等元數據等

當我只與數據的一個子集(10%),但它甚至不完成,如果我使用完整的數據集,這運行相當快(10分鐘)因爲我在這行sampletrainDT[, Body := gsub("<(.|\n)*?>", " ", Body)] # remove HTML tags用完了RAM。在行之間運行gc()似乎並沒有改善這種情況。

我已經花了幾天的時間搜索解決方案,但是我還沒有找到一個好的解決方案,所以我很想聽到其他人有很多的經驗。下面是我正在考慮一些選擇:

  1. FF或bigmemory - 很難使用,並在同一時間,流程以塊的形式不適合文本
  2. 數據庫
  3. 讀取和附加到文件(更適合的Python ?)從TM庫
  4. PCorpus
  5. 地圖 - 減少 - 本地,但希望在記憶友好的方式完成
  6. 爲R只是沒有這個工具?

我想在一臺機器(16 GB筆記本電腦)上運行它,而不是在EC2上使用大型機器。如果正確完成,6GB的數據似乎並不是不可逾越的!

+0

我覺得很奇怪,你需要所有RAM ......我每天處理5個10萬行的16G筆記本電腦文件。你能發送你的文件嗎? – statquant

+0

@statquant我的數據框的前100行。 https://dl.dropboxusercontent.com/u/25747565/temp.RData – mchangun

+1

或者您可以使用其他語言/腳本來清理數據,然後使用R進行分析。 – Fernando

回答

1

我不確定到底發生了什麼,但這裏有一些有用的提示。首先,這是我用來監視的對象佔用了內存的功能:

lsBySize<-function(k=20,envir=globalenv()){ 
    z <- sapply(ls(envir=envir), function(x) object.size(get(x))) 
    ret<-sort(z,T) 
    if(k>0) 
    ret<-ret[1:min(k,length(ret))] 

    as.matrix(ret)/10^6 
} 

在任何時間運行gc()會告訴你多少內存目前正在使用。如果sum(lsBySize(length(ls)))gc()報告的內存使用量不相等,則會出現一些奇怪的情況。在這種情況下,請編輯OP以顯示連續運行這兩個命令的R會話的輸出。此外,爲了隔離這個問題,最好至少在現在使用data.frames,因爲data.tables的內部更加複雜和不透明。