繁体   English   中英

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

[英]Fastest way to subset - data.table vs. MySQL

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

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

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

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

如果数据适合 RAM,则 data.table 更快。 如果您提供一个示例,很可能很快就会发现您正在严重使用 data.table。 您是否阅读过data.table wiki上的“注意事项”?

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

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

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM