r - 大型数据集中的选择/投影/分组

标签 r data.table

我读了这篇文章http://hannes.muehleisen.org/ssdbm2014-r-embedded-monetdb-cr.pdf很高兴看到 data.table 表现非常好。然而,令我惊讶的是,对于较大的文档(1GB 和 10GB),选择、选择/投影和分组是如此之慢。我认为 data.table 很棒,而且令人惊讶的是,对于较大的数据集,它的速度要慢 5 倍到 10 倍。

我知道我不应该在微观基准测试上投入太多精力,而且我也没有这样做。事实上,读完这篇文章后,我更加确信使用 data.table 是有益的,因为它的语法一致且简单。我不仅关心原始性能。我问这个问题是因为 data.table 作者有兴趣研究这些问题,并且非常擅长解释为什么(或为什么不) data.table 如此执行。这是我喜欢喜欢使用 data.table 的另一个原因。

感谢马特·道尔等人。

最佳答案

感谢您的链接和赞扬。非常有趣的阅读。对我来说真正令人印象深刻的三点(在许多很酷的事情中)是:

  • 将数据库嵌入到 R/统计环境中(与规范相反)。

  • 将两个系统置于同一地址空间下。

  • 从原始类型转换为 SEXP,无需复制(/额外内存)。

尽管这些需要对源代码进行修改。

data.table 进行比较,但这里有一些问题:

他们与一年多前的 v1.8.10 进行比较。从那时起,data.table 已经发展了很多。

  • 更快且高效缓存的基于 MSD 的基数排序(适用于整数、 double 、字符、integer64)。由于 data.table 使用排序来查找组索引以执行聚合、连接和几乎所有其他操作,这意味着现在几乎所有操作都快得多。

  • 实现 GForce 以避免花费时间评估每个组的 j 表达式,这使得使用这些函数进行临时分组更快。

  • 许多错误修复和功能实现 - 内存泄漏修复,通过避免不必要的复制来提高内存效率等。 Check news .

  • 更快的子集设置(使用 native 实现)、更快的二分搜索(因此更快的联接和子集)以及最近的自动索引等。

此外,还不清楚他们使用了哪些编译器优化。

要了解自 1.8.10 以来的加速情况,请查看 this recent benchmark由马特.

# data.table 1.9.2    50GB    10,000 groups    < 1 minute    (from Matt's benchmark)
# data.table 1.8.10   10GB       500 groups    ~ 18 minutes! (from their article)

使用 data.table 将超过 50GB 的数据分组为 10,000 个组只需不到一分钟(在 2.5Ghz 处理器上,请参阅链接中的详细规范),而将 10GB 的数据聚合为仅 500 个组大约需要 18 分钟基准测试(在 3.4Ghz 处理器上)。

他们没有在文章中谈论他们机器的缓存大小、数据维度、分组依据的列数等。(或者我错过了从文本中阅读它)。

从那时起,已经有一些性能修复。一次 this FR 投影将会变得更快受到照顾。尽管我似乎在他们的文章中找不到源代码的链接,但重新运行此基准测试(也许还有更多测试)会很有趣。

但又是一本非常好的读物。

关于r - 大型数据集中的选择/投影/分组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27510407/

相关文章:

r - 预测预测的标准误差

r - 访问 S4 函数父类(super class)的槽

r - 减少 R 中的内存消耗——通过引用/data.table 传递

r - 使用 R 中的函数和条件函数参数进行分组和变异

r - 用 R 下载 png/jpg

r - 在 RStudio 中离线安装包

r - R 中的分组条形图居中(ggplot2)

r - Unique in data.table 错误地删除了一些值

R 中的滚动连接 data.table

r - 将字母添加到 data.table R 中的 setnames