RMongoDB와 함께 작업 중이며 쿼리 값이있는 빈 data.frame을 채워야합니다. 결과는 약 2 백만 개의 문서 (행)로 상당히 길다.느린 data.frame 행 지정
성능 테스트를 수행하는 동안 행에 값을 쓰는 시간이 데이터 프레임의 크기만큼 증가한다는 것을 알게되었습니다. 어쩌면 그것은 잘 알려진 이슈이고 나는 그것을 알아 차릴 마지막 사람입니다.
일부 코드 예제 : 내 컴퓨터에
set.seed(20140430)
nreg <- 2e3
dfres <- as.data.frame(matrix(rep(NA,nreg*7),nrow=nreg,ncol=7))
system.time(dfres[1e3,] <- c(1:5,"a","b"))
summary(replicate(10,system.time(dfres[sample(1:nreg,1),] <- c(1:5,"a","b"))[3]))
nreg <- 2e6
dfres <- as.data.frame(matrix(rep(NA,nreg*7),nrow=nreg,ncol=7))
system.time(dfres[1e3,] <- c(1:5,"a","b"))
summary(replicate(10,system.time(dfres[sample(1:nreg,1),] <- c(1:5,"a","b"))[3]))
, 약 0.4 초 정도 data.frame 2 milion 행에 할당. 전체 데이터 집합을 채우려면 많은 시간이 필요합니다. 이 문제를 이끌어 내기 위해 두 번째 시뮬레이션이 진행됩니다.
nreg <- seq(2e1,2e7,length.out=10)
te <- NULL
for(i in nreg){
dfres <- as.data.frame(matrix(rep(NA,i*7),nrow=i,ncol=7))
te <- c(te,mean(replicate(10,{r <- sample(1:i,1); system.time(dfres[r,] <- c(1:5,"a","b"))[3]})))
}
plot(nreg,te,xlab="Number of rows",ylab="Avg. time for 10 random assignments [sec]",type="o")
#rm(nreg,dfres,te)
질문 : 이런 이유는 무엇입니까? 메모리에 data.frame을 채우는 더 빠른 방법이 있습니까?
워크 어라운드 : 가득 차기까지 1e4 행의 임시 data.frame에 행을 지정합니다. 그런 다음 최종 데이터로 프레임을 바인딩하고 작은 프레임을 다시 채 웁니다. – Emer