如何加速rbind?

时间:2013-10-31 02:56:20

标签: r

我应该从MS-SQL服务器下载一个表。

行数大于600万。服务器无法一次返回整个数据。

所以,我写了一个代码,一次下载10,000行。并且,它绑定循环中的行。

假设getData()函数一次返回一个包含10000行的数据帧。 (伪代码)

for(i in 1:600)
{
    tempValue <- getData()
    wannagetValue <- rbind(wannagetValue,tempValue)
    print(i)
}

问题是随着时间的推移,它会变慢。

我认为像这样使用rbind不是一个好主意。

任何建议都会非常有帮助。提前谢谢。

2 个答案:

答案 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行查询一次数据库是一个好主意。尝试通过将数据导出到本地磁盘并从那里读取来避免这种情况。它也会提高速度。存储便宜,网络带宽和内存不是。