首先要检查的是data.table
FAQ 3.1 第 2 点已深入:
只为最大的组分配一次内存,然后
内存被其他组重用。垃圾很少
去收集。
这就是 data.table 分组速度很快的原因之一。但这种方法不适合并行化。并行化意味着将数据复制到其他线程,这会消耗时间。但是,我的理解是data.table
分组通常比plyr
with .parallel
无论如何。这取决于每个组任务的计算时间,以及该计算时间是否可以轻松减少。移动数据通常占主导地位(当对 1 或 3 次大数据任务运行进行基准测试时)。
到目前为止,更常见的情况是,实际上是一些问题困扰着我们。j
的表达[.data.table
。例如,最近我们看到性能不佳data.table
分组但罪魁祸首竟然是min(POSIXct)
(在 R 中聚合超过 80K 个唯一 ID https://stackoverflow.com/questions/14590596/aggregating-in-r-over-80k-unique-ids)。避免这个问题可以使速度提高 50 倍以上。
所以口头禅是:Rprof
, Rprof
, Rprof
.
此外,同一常见问题解答中的第 1 点可能很重要:
仅该列被分组,其他 19 列被忽略,因为
data.table 检查 j 表达式并意识到它没有使用
其他栏目。
So, data.table
实际上根本不遵循拆分-应用-组合范例。它的工作原理不同。拆分-应用-组合适合并行化,但它确实无法扩展到大数据。
另请参阅 data.table 简介小插图中的脚注 3:
我们想知道有多少人正在将并行技术部署到代码中
这就是矢量扫描
这试图说“当然,并行速度明显更快,但对于高效算法来说,它真正需要多长时间?”。
但是如果你已经分析过(使用Rprof
),以及每组的任务真的是计算密集型,那么 datatable-help 上的 3 个帖子(包括“多核”一词)可能会有所帮助:
当然,有很多任务在 data.table 中并行化会很好,并且有一种方法可以做到这一点。但它还没有完成,因为通常还有其他因素影响,所以它的优先级较低。如果您可以发布可重复的虚拟数据以及基准和 Rprof 结果,这将有助于提高优先级。