r - 快速合并两个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")]
解决方案
从您的示例中,我们看不到数据类型之类的详细信息。
data.table 连接当前是单线程的。它的一些小部分使用多个核心,但这是 AFAIR 仅在连接列中查找顺序。计算匹配在单线程中进行。
请记住,并行化连接并非微不足道,并且不会像许多其他操作那样扩展,因此在分组方面的潜在收益要小得多。
无论如何,这种计算匹配仍然非常快。我们运行一个基准来比较连接,其中一个问题(问题 5)是“从大到大连接”,这似乎与您的场景相对应。https://h2oai.github.io/db-benchmark/ 下面是加入任务的100M数据大小。Q5 是 100M LHS 到 100M RHS 的连接:
您可以看到 data.table 几乎位于顶部。请注意,我们在那里加入单个整数列,因此您加入两列的方案可能会有所不同。Benchmark 没有考虑对数据进行预排序的可能性。尝试在您的表上使用setkey
(而不是setorder
)按连接列对它们进行排序。公平地说,我相信击败这种设置可能并不容易。
在未来的版本中,join 的计算匹配也将被并行化,其草稿已经在存储库中。
推荐阅读
- angular - Angular 4:使用 angular-user-idle 检测空闲用户
- c++ - glBufferData 失败并显示:“数组对象未激活。”
- c++ - 尝试在 C++ 中反转字符串但返回相同的字符串
- asp.net-core - Serilog 不接受 StaticFiles、Hosting 和 EF Core 的 MinimumLevel
- git - 是否可以让 `git gc` 打包 reflog 对象?
- javascript - 使用 Twilio 发送 SMS - 添加换行符
- rest - 如何在 REST API 中正确使用 HTTP 请求方法?
- c# - 无法在循环中正确显示内容
- powershell - Set-AzureStorageBlobContent 在 Powershell 中以 100% 的速度挂起
- c# - Raycast没有击中任何东西