【问题标题】:Quickly merging two data.tables - parallelization or data.table快速合并两个data.tables - 并行化或data.table
【发布时间】:2021-07-29 05:57:12
【问题描述】:

我正在尝试合并两个 data.table,它们的长度都在 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")]

【问题讨论】:

  • 也许找出答案的唯一方法是为 10m 行计时?
  • setkey 也很受欢迎。

标签: r data.table


【解决方案1】:

从您的示例中,我们看不到数据类型等太多细节。

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

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

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

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

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

【讨论】:

  • 难以置信! data.table 甚至比 Python 的 pandas 还要快?
  • 众所周知,pandas 竞争力不强,所以我不知道为什么会有这样的印象
猜你喜欢
  • 2012-10-27
  • 2021-03-22
  • 1970-01-01
  • 2021-12-20
  • 2012-10-29
  • 2015-11-29
  • 1970-01-01
  • 2021-02-03
  • 1970-01-01
相关资源
最近更新 更多