子集的最快方式 - data.table与MySQL

时间:2011-07-06 01:30:31

标签: mysql r rmysql data.table

我是R用户,我经常发现我需要编写需要对大型数据集进行子集化的函数(数百万行)。当我在大量观察中应用这些函数时,如果我不小心如何实现它,它会非常耗时。

为此,我有时使用data.table包,这比使用数据帧的子集提供了更快的速度。最近,我开始尝试使用像RMySQL这样的包,将一些表推送到mysql,并使用该包运行sql查询并返回结果。

我发现性能改进不一。对于较小的数据集(数百万),似乎将数据加载到data.table并设置正确的密钥可以实现更快的子集化。对于较大的数据集(10到100万),看起来向mysql发送查询的速度更快。

想知道是否有人知道哪种技术应该更快地返回简单的子集或聚合查询,以及这是否应该取决于数据的大小?我知道在data.table中设置键有点类似于创建索引,但除此之外我没有更多的直觉。

2 个答案:

答案 0 :(得分:26)

如果数据适合RAM,则data.table更快。如果您提供一个示例,很快就会明显地表明您正在使用data.table。您是否阅读了data.table wiki上的“做与不做”?

SQL有一个下限,因为它是一个行存储。如果数据适合RAM(并且64位相当多),则data.table更快,不仅因为它在RAM中,而且因为列在内存中是连续的(最小化从RAM到L2的页面提取以进行列操作)。正确使用data.table,它应该比SQL的下限更快。这在FAQ 3.1中有解释。如果你看到data.table速度较慢,那么你使用data.table的可能性非常高(或者我们需要解决的是性能错误)。所以,请在阅读data.table wiki后发布一些测试。

答案 1 :(得分:2)

我不是R用户,但我对数据库知之甚少。我相信MySQL(或任何其他可信赖的RDBMS)实际上会更快地执行子集化操作(通常,通过一个数量级),除非在子集化过程中涉及任何额外的计算。

我怀疑你的小数据集的性能滞后与连接的费用和数据初始推送到MySQL有关。可能有一点,连接开销和数据传输时间比MySQL节省您的操作成本更多。

但是,对于大于某个最小值的数据集,似乎可以通过数据库的绝对速度来补偿此成本。

我的理解是,SQL可以比代码中的迭代操作更快地实现大多数提取和排序操作。但必须考虑连接成本和(在这种情况下)通过网络线进行的初始数据传输。

我很想听听其他人的发言。 。 。