【问题标题】:Fastest way to subset - data.table vs. MySQL最快的子集化方法 - data.table vs. MySQL
【发布时间】:2011-09-29 06:10:21
【问题描述】:

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

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

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

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

【问题讨论】:

  • 我知道这里的其他一些人对此有更多经验,所以我会让他们用实际答案来解释它,但我怀疑你会想看看 sqldf 包正是您所描述的,只是它在内存中创建了表(我认为),因此查询可能会运行得更快。
  • 谢谢,乔兰!我很想在大表的背景下理解这一点。这都是猜测,但我得到的建议是,我遇到的速度问题可能是由于内存管理/限制造成的。毕竟在使用data.table的时候,那些表不也是在内存中的吗?
  • 确实,对于大内存的数据将是一个问题,但我相信 sqldf 也可以使用磁盘数据库。再说一次,我用的不多,我提到它是因为它是一个完整的包,围绕着将数据推送到数据库、执行 sql 然后将其返回给 R 的概念构建。
  • 如果您将 sqldf 与 SQLite 一起使用,则 sqldf("...sql statement...", dbname = tempfile()) 使用磁盘,但没有 dbname= arg 它使用内存。如果您通过 RMySQL 将 sqldf 与 MySQL 一起使用,那么它默认使用 dbname = "test"

标签: mysql r rmysql data.table


【解决方案1】:

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

【讨论】:

  • 道尔 - 不错!我现在自己也要去维基。我一直都明白,对于大多数查询来说,Db 更快,但现在我可以看看为什么,以及这些界限是什么。有时需要一个正确的方向。 . .谢谢!
【解决方案2】:

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

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

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

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

我很想听听别人怎么说。 . .

【讨论】:

  • 感谢您的帖子!只是澄清一下-我不会每次迭代都将数据集推送到 MySQL;相反,我只在运行函数之前执行一次。所以我只需要从 R 推送到 MySQL 就可以达到迭代是一个值或一个向量,用于查询子集。
  • 嗯。我仍然会对“小”和“大”数据集之间性能统计数据变化背后的原因感兴趣。可能仍然与连接开销有关,即使没有推送? (例如连接开销占总执行时间的百分比)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-10-17
  • 1970-01-01
  • 1970-01-01
  • 2014-10-04
  • 2013-07-03
相关资源
最近更新 更多