首页 > 解决方案 > 快速合并两个data.tables - 并行化或data.table

问题描述

我正在尝试合并两个 data.tables,它们的长度都在 60-80 百万行左右。我知道 data.table 已经构建,因此它非常擅长合并,但我想知道这种大小的数据是 data.table 仍然比潜在地并行化它更有效,特别是因为我可以访问计算集群。

这就是我目前正在做的事情。

setorder(fcc_temp, BlockCode)
setorder(BlockCode, block_fips)
fcc_temp[block_data_long, c("pop", "tract") := list(pop, tract), 
           on = c(BlockCode="block_fips", year="year")]

标签: rdata.table

解决方案


从您的示例中,我们看不到数据类型之类的详细信息。

data.table 连接当前是单线程的。它的一些小部分使用多个核心,但这是 AFAIR 仅在连接列中查找顺序。计算匹配在单线程中进行。

请记住,并行化连接并非微不足道,并且不会像许多其他操作那样扩展,因此在分组方面的潜在收益要小得多。

无论如何,这种计算匹配仍然非常快。我们运行一个基准来比较连接,其中一个问题(问题 5)是“从大到大连接”,这似乎与您的场景相对应。https://h2oai.github.io/db-benchmark/ 下面是加入任务的100M数据大小。Q5 是 100M LHS 到 100M RHS 的连接: 在此处输入图像描述

您可以看到 data.table 几乎位于顶部。请注意,我们在那里加入单个整数列,因此您加入两列的方案可能会有所不同。Benchmark 没有考虑对数据进行预排序的可能性。尝试在您的表上使用setkey(而不是setorder)按连接列对它们进行排序。公平地说,我相信击败这种设置可能并不容易。

在未来的版本中,join 的计算匹配也将被并行化,其草稿已经在存储库中。


推荐阅读