提高選擇子集的效能

# example data
set.seed(1)
n  = 1e7
ng = 1e4
DT = data.table(
    g1  = sample(ng, n, replace=TRUE),
    g2  = sample(ng, n, replace=TRUE),
    v  = rnorm(n)
)

匹配一列

第一次使用 ==%in%進行子集化操作後……

system.time(
    DT[ g1 %in% 1:100]
)
#    user  system elapsed 
#    0.12    0.03    0.16 

已為 g1 自動建立索引。後續的子集操作幾乎立即執行:

system.time(
    DT[ g1 %in% 1:100]
)
#    user  system elapsed 
#       0       0       0

要監視建立或使用索引的時間,請新增 verbose=TRUE 選項或更改全域性設定 options(datatable.verbose=TRUE)

匹配多列

目前,在兩列上匹配不會自動建立索引:

system.time(
    DT[ g1 %in% 1:100 & g2 %in% 1:100]
)
#    user  system elapsed 
#    0.57    0.00    0.57

重新執行它,它將保持緩慢。即使我們使用 setindex(DT, g1, g2) 手動新增索引,它仍將保持緩慢,因為該查詢尚未通過包進行優化。

幸運的是,如果我們可以列舉我們想要搜尋的值組合並且索引可用,我們可以快速等同連線:

system.time(
    DT[ CJ(g1 = 1:100, g2 = 1:100, unique=TRUE), on=.(g1, g2), nomatch=0]
)
#    user  system elapsed 
#    0.53    0.00    0.54 
setindex(DT, g1, g2)
system.time(
    DT[ CJ(g1 = 1:100, g2 = 1:100, unique=TRUE), on=.(g1, g2), nomatch=0]
)
#    user  system elapsed 
#       0       0       0

對於 CJ,重要的是要注意組合數量變得太大。