거대한 데이터 세트를 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)
첫 번째 루프에서'substring ("2005400d", varIn, varEND)'을 수행하고 있습니까? 그렇지 않다면, 당신은 비슷한 것을 사용할 수있을 것 같습니다 (어느 쪽이 더 빠릅니다) –
원래의 데이터는 고정 폭으로 포맷되어 있습니까? 그런 다음 [** this post **] (http://stackoverflow.com/questions/18720036/reading-big-data-with-fixed-width)가 관련 될 수 있습니다. – Henrik
'rbind'를 데이터 프레임에 보관하지 마십시오. 각각의 데이터 프레임의리스트를 만든다. do.call (rbind, ListOfDataFrames) –