我正在使用RMongoDB,并需要用查询结果填充一个空数据框。结果非常长,大约有200万条文档(行)。
在做性能测试时,我发现写入一行的时间会随着数据框的维度增加而增加。可能这是一个众所周知的问题,而我是最后一个注意到它的人。
下面是一些代码示例:
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]))
在我的电脑上,处理200万行数据框的赋值需要约0.4秒的时间。如果我想填充整个数据集,这将是很长时间。下面进行第二次模拟以了解问题。
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)
问题: 为什么会出现这种情况?有没有更快的方式在内存中填充数据框?