2014-07-06 3 views
0

거대한 데이터 세트를 R (1.3Gb)로 구문 분석하려고합니다. 원래의 데이터는 400 만 개의 문자로 구성된 목록으로 각 변수는 137 개의 변수를 관찰합니다.다른 루프에서 함수를 호출하는 for 루프에서 더 빠른 대안

먼저 데이터 세트에 제공된 키에 따라 문자를 구분하는 함수를 만들었습니다. 여기서 "d"는 문자 각각입니다. 그 D 상상이 질문의 목적을 위해하는이 양식을

"2005400d"

을 가지고 있으며, 키가 될 것 varIn 및 바 렌드가 분할 지점을 추적

varName <- c("YEAR","AGE","GENDER","STATUS") 
varIn <- c(1,5,7,8) 
varEND <- c(4,6,7,8) 

. 생성 된 함수가 생성되었습니다.

parseLine<-function(d){ 
    k<-unlist(strsplit(d,"")) 
    vec<-rep(NA,length(varName)) 
    for (i in 1:length(varName)){ 
    vec[i]<-paste(k[varIn[i]:varEnd[i]],sep="",collapse="") 
    } 
    return(vec) 
} 

그리고 사용 가능한 모든 데이터를 반복하기 위해 for 루프를 만들었습니다. 나는 1000 반복과 기능을 검사 할 때

df<-data.frame(matrix(ncol=length(varName))) 
names(df)<-as.character(varName) 

for (i in 1:length(data)){ 
    df<-rbind(df,parseLine(data[i])) 
} 

그러나 나는 10.82 초 시스템 시간을 가지고,하지만 난 10,000 대신 108.2 초의 시간을 보내고의 내가 614.77의 시간을 가지고 있음을 증가 할 때 어떤 나타냅니다 반복 횟수가 증가함에 따라 필요한 시간이 기하 급수적으로 늘어날 것입니다.

프로세스 속도 향상에 대한 제안이 있으십니까? 나는 foreach 라이브러리를 사용하려했지만 예상했던대로 병렬을 사용하지 않았다.

m<-foreach(i=1:10,.combine=rbind) %dopar% parseLine(data[i]) 
df<-a 
names(df)<-as.character(varName) 
+1

첫 번째 루프에서'substring ("2005400d", varIn, varEND)'을 수행하고 있습니까? 그렇지 않다면, 당신은 비슷한 것을 사용할 수있을 것 같습니다 (어느 쪽이 더 빠릅니다) –

+2

원래의 데이터는 고정 폭으로 포맷되어 있습니까? 그런 다음 [** this post **] (http://stackoverflow.com/questions/18720036/reading-big-data-with-fixed-width)가 관련 될 수 있습니다. – Henrik

+1

'rbind'를 데이터 프레임에 보관하지 마십시오. 각각의 데이터 프레임의리스트를 만든다. do.call (rbind, ListOfDataFrames) –

답변

3

왜 바퀴를 다시 발명합니까? 당신이 colClasses를 지정하고 입증하는 내 노력이 차이를 보여 실패한 경우 (기본적으로 부착)이 유틸 패키지

> dat <- "2005400d" 
> varName <- c("YEAR","AGE","GENDER","STATUS") 
> varIn <- c(1,5,7,8) 
> varEND <- c(4,6,7,8) 
> read.fwf(textConnection(dat), col.names=varName, widths=1+varEND-varIn) 
    YEAR AGE GENDER STATUS 
1 2005 40  0  d 

당신은 더 효율성을 받아야에 read.fwf 사용합니다. 아마도 해당 조언은 read.table과 사촌에만 적용됩니다.

+0

나는 바보이다 ... 나는 읽은 것에 대해 잘 몰랐다. 기능 ... 정말 고마워! – comendeiro