2013-10-17 3 views
0

처리하고자하는 6 백만 개의 메시지 6GB 데이터 세트 - 내 목표는 내 데이터 집합에 대한 문서 용어 매트릭스를 만드는 것이지만 일부 사전 처리 (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 %) 전체 데이터 집합을 사용하면 완료되지 않습니다. 이 줄에 RAM이 없기 때문에 sampletrainDT[, Body := gsub("<(.|\n)*?>", " ", Body)] # remove HTML tags. 줄 사이에 gc()를 실행해도 상황이 개선되지 않는 것 같습니다.

나는 인터넷 검색을 며칠 동안 보냈지 만 아직 좋은 해결책을 찾을 수 없었으므로이 분야에 많은 경험이있는 사람들의 의견을 듣고 싶습니다. - 파이썬 (사용하기 어려운 한 번, 과정에서 덩어리

  • 읽기 텍스트
  • 데이터베이스에 적합하고 파일에 추가하지 더 적합

    1. FF 또는 bigmemory : 여기에 내가 고려하고 몇 가지 옵션이 있습니다 ?) TM 라이브러리에서
    2. PCorpus는
    3. 지도-감소 - 메모리 친화적 인 방법으로 로컬 그러나 희망 할
    4. 는 R은 이것을위한 도구가 아닙니다?

    나는 EC2에서 큰 기계를 사용하는 대신 하나의 기계 (16GB 노트북)에서 실행하고 싶습니다. 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의 내부가 더 복잡하고 불투명하기 때문입니다.