我应该从MS-SQL服务器下载一个表。
行数大于600万。服务器无法一次返回整个数据。
所以,我写了一个代码,一次下载10,000行。并且,它绑定循环中的行。
假设getData()
函数一次返回一个包含10000行的数据帧。 (伪代码)
for(i in 1:600)
{
tempValue <- getData()
wannagetValue <- rbind(wannagetValue,tempValue)
print(i)
}
问题是随着时间的推移,它会变慢。
我认为像这样使用rbind不是一个好主意。
任何建议都会非常有帮助。提前谢谢。
答案 0 :(得分:4)
正如上面已经指出的那样,R默认将其所有对象存储在RAM中,因此使用这些数据时,您将遇到一些问题。
我想补充两件事:
1)通常,如果您不想使用data.table,您可以使用Hadley的rbind.fill
包中的plyr
函数,这也非常快。 从不以上述方式使用rbind
,在'for'循环中,分别追加每一行。它会强制R在每次追加一行时复制数据框对象,这很慢。
2)要使用R处理大于RAM的数据,请查看http://cran.r-project.org/web/views/HighPerformanceComputing.html处的大内存和内存不足数据部分,可能是{{ 1}}包是你需要的。
答案 1 :(得分:0)
也许您可以执行SELECT COUNT(*) FROM table_name WHERE ...
然后为数据框预分配空间。
实际上,我不认为每10k行查询一次数据库是一个好主意。尝试通过将数据导出到本地磁盘并从那里读取来避免这种情况。它也会提高速度。存储便宜,网络带宽和内存不是。