20

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

为此,我有时会使用 data.table 包,它提供的速度比使用数据帧的子集快得多。最近开始试验RMySQL之类的包,将一些表推送到mysql,并使用该包运行sql查询并返回结果。

我发现混合的性能改进。对于较小的数据集(数百万),似乎将数据加载到 data.table 并设置正确的键有助于更快的子集。对于较大的数据集(10 到 100 百万),向 mysql 发送查询似乎移动得更快。

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

4

2 回答 2

32

如果数据适合 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 之后发布一些测试。

于 2011-07-06T09:27:17.903 回答
3

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

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

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

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

我很想听听其他人怎么说。. .

于 2011-07-06T01:40:53.143 回答