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

R 大型数据集中的选择/投影/分组,r,data.table,R,Data.table,我读了这篇文章,很高兴看到这个数据。这个表表现得很好。然而,对于较大的文档(1GB和10GB),选择、选择/投影和分组速度如此之慢,这让我感到惊讶。我认为data.table是令人惊讶的,我发现对于更大的数据集,它的速度慢了5-10倍 我明白我不应该在微观基准上投入太多的资金,我也不这么认为。事实上,在阅读了本文之后,我更加确信使用data.table是有益的,因为它的语法一致且简单。我不仅关心原始的表现。我之所以提出这个问题,是因为data.table的作者对研究这些问题感兴趣,并且非常擅长解

我读了这篇文章,很高兴看到这个数据。这个表表现得很好。然而,对于较大的文档(1GB和10GB),选择、选择/投影和分组速度如此之慢,这让我感到惊讶。我认为data.table是令人惊讶的,我发现对于更大的数据集,它的速度慢了5-10倍

我明白我不应该在微观基准上投入太多的资金,我也不这么认为。事实上,在阅读了本文之后,我更加确信使用data.table是有益的,因为它的语法一致且简单。我不仅关心原始的表现。我之所以提出这个问题,是因为data.table的作者对研究这些问题感兴趣,并且非常擅长解释data.table为什么(或为什么不)会这样做。这是我喜欢使用data.table的另一个原因


感谢Matt Dowle等人。

感谢链接和表扬。读起来很有趣。在众多酷的东西中,有三点让我印象深刻:

  • 将数据库嵌入R/statistics环境(与规范相反)

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

  • 无需拷贝(/额外内存)即可将基本类型转换为SEXPs

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

关于与
数据的比较。表
然而,这里有一些问题:

它们与1.8.10版进行了比较,1.8.10版已经有一年多的历史了。从那时起,data.table有了很大的发展

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

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

  • 许多错误修复和功能的实施-内存泄漏修复,更有效的内存避免不必要的副本等

  • 更快的子集设置(使用本机实现)、更快的二进制搜索(因此更快的联接和子集),以及最近的自动索引等

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

要想了解自1.8.10以来的加速效果,请看一下Matt的文章

# 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 1.9.2 50GB 10000组<1分钟(来自Matt的基准测试)
#数据表1.8.10 10GB 500组~18分钟!(摘自他们的文章)
使用data.table将超过50GB的数据与10000个组分组只需不到一分钟(在2.5Ghz处理器上,请参阅链接中的详细规格),而在基准测试中(在3.4Ghz处理器上),仅使用500个组聚合10GB的数据大约需要18分钟

他们在文章中没有提到机器的缓存大小、数据维度、分组依据的列数等。。(或者我没有从课文中读到它)

从那时起,已经有了一些性能修复。一旦得到处理,预测将变得更快。重新运行这个基准测试(可能还有更多测试)会很有趣,尽管我在他们的文章中似乎找不到源代码的链接


不过还是很好的阅读。

谢谢你的解释。我很尴尬,我没有检查论文中使用的数据表版本。我已经看过Matt的最新基准测试,这就是为什么我对他们的发现感到惊讶。顺便说一句,即使是论文的作者也对data.table的表现感到惊讶!继续做好工作。它们在文件读取方面如何比较?
fread
功能大大提高了用户效率。@bondedust,当然会很有趣。它们不会对读取文件进行基准测试。他们简要提到了MonetDB使用内存映射文件进行读/写,但没有提到速度/效率。目前还不清楚他们是如何处理这个问题的/与fread相比,这个问题处理得有多好。