提高選擇子集的效能
# 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
,重要的是要注意組合數量變得太大。