gpt4 book ai didi

sql - data.table 连接的时间

转载 作者:行者123 更新时间:2023-12-01 12:51:40 25 4
gpt4 key购买 nike

我在 R 中有两个 data.table:

> tables()
NAME NROW MB COLS KEY
[1,] dtb 2,536,206 68 dte,permno,capm_beta,mkt_beta_bucket permno,dte
[2,] idx_dtb 573 1 dte dte
[3,] ssd_dtb 58,808,208 1571 dte,permno,xs_ret,mkt_cap permno,dte
Total: 1,640MB

我想做一个右外连接:select * from dtb right join ssd_dtb using (permno, dte)

data.table 中的等效命令是:

mdtb <- dtb[ssd_dtb]

到目前为止,它已经运行了大约 20 分钟。这看起来有点长,因为它通常在 SQL 服务器上运行需要更少的时间。我是否滥用了这个包?

问题回答后编辑:我认为这可能有助于理解为什么我必须执行 dtb[ssd_dtb] 而不是 ssd_dtb[dtb]。我设计了一个简单的例子:

> x <- data.table(id=1:5, t=1:15, v=1:15)
> x
id t v
1: 1 1 1
2: 2 2 2
3: 3 3 3
4: 4 4 4
5: 5 5 5
6: 1 6 6
7: 2 7 7
8: 3 8 8
9: 4 9 9
10: 5 10 10
11: 1 11 11
12: 2 12 12
13: 3 13 13
14: 4 14 14
15: 5 15 15
> y <- data.table(id=c(1,1,2,3), t=c(1,2,6,13), v2=41:44)
> y
id t v2
1: 1 1 41
2: 1 2 42
3: 2 6 43
4: 3 13 44

> x[y]
id t v v2
1: 1 1 1 41
2: 1 2 NA 42
3: 2 6 NA 43
4: 3 13 13 44
> x[y, nomatch=0]
id t v v2
1: 1 1 1 41
2: 3 13 13 44
> y[x]
id t v2 v
1: 1 1 41 1
2: 1 6 NA 6
3: 1 11 NA 11
4: 2 2 NA 2
5: 2 7 NA 7
6: 2 12 NA 12
7: 3 3 NA 3
8: 3 8 NA 8
9: 3 13 44 13
10: 4 4 NA 4
11: 4 9 NA 9
12: 4 14 NA 14
13: 5 5 NA 5
14: 5 10 NA 10
15: 5 15 NA 15
> y[x, nomatch=0]
id t v2 v
1: 1 1 41 1
2: 3 13 44 13

编辑 2:上述解决方案 1 请求的输出如下:

> Rprof()> mdtb  Rprof(NULL)> summaryRprof()$by.self               self.time self.pct total.time total.pct"[.data.table"     15.36    62.39      24.62    100.00".Call"             7.96    32.33       7.96     32.33"pmin"              0.92     3.74       1.16      4.71"list"              0.24     0.97       0.24      0.97"vector"            0.14     0.57       0.14      0.57$by.total               total.time total.pct self.time self.pct"[.data.table"      24.62    100.00     15.36    62.39"["                 24.62    100.00      0.00     0.00".Call"              7.96     32.33      7.96    32.33"pmin"               1.16      4.71      0.92     3.74"list"               0.24      0.97      0.24     0.97"vector"             0.14      0.57      0.14     0.57"integer"            0.14      0.57      0.00     0.00$sample.interval[1] 0.02$sampling.time[1] 24.62

最佳答案

如果我能在没有可重现示例的情况下进行猜测,我会尝试。在这种情况下,我会想到一些事情。好问题。

  1. 在这种情况下,源代码中有一个 TODO 可能会导致速度大幅下降。不过,我并不知道事情有那么糟糕。如果您知道 dtb 的 key 是唯一的(即在每个 permno 中没有重复的 dte),很可能在这里,那么设置 mult="first" 来解决它。或者 mult="last" 是一样的。它正在做的是找到组的起点和终点,但是当一个键是唯一的时,所有这些组都只有 1 行。

  2. 较小的影响可能是 i 表与您的情况下的 x 相比较大。如果可能,尽量安排 i 小于 x 的查询;即 ssd_dtb[dtb] 而不是 dtb[ssd_dtb]。当 nomatch=0 时,它们将是相同的。

如果 1 中的解决方法有帮助,那么如果您可以运行以下命令并将结果发送给我,那就太好了。另外,请提出一个 bug.report(package="data.table") 链接回这个问题。这样,当状态发生变化时,您将获得自动更新。

Rprof()
dtb[ssd_dtb] # reduce size so that this takes 30 seconds or something manageable
Rprof(NULL)
summaryRprof()

Rprof()
dtb[ssd_dtb,mult="first"] # should be faster than above if my guess is right
Rprof(NULL)
summaryRprof()

关于sql - data.table 连接的时间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12042779/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com