7
我有一個data.table有兩個鍵:Year(10級)和MemberID(200,000級)。當我setkey,setkey(MemberID, Year)
導致與setkey(Year, MemberID)
不同的性能?如果是這樣,哪種方式會更好?data.table中的鍵的順序是否重要?
我有一個data.table有兩個鍵:Year(10級)和MemberID(200,000級)。當我setkey,setkey(MemberID, Year)
導致與setkey(Year, MemberID)
不同的性能?如果是這樣,哪種方式會更好?data.table中的鍵的順序是否重要?
鍵設置的性能和速度取決於鍵變量類型。 numeric
列將比integer
慢。 character
列(短字符串)看起來很快。
如
library(data.table)
set.seed(1)
DIC <- data.table(year = sample(seq_len(10), 5e6, TRUE), id = sample(as.character(seq_len(2e5)), 5e6, TRUE), z = rnorm(5e6))
DIC2 <- copy(DIC)
DIF <- data.table(year = sample(seq_len(10), 5e6, TRUE), id = sample(as.factor(seq_len(2e5)), 5e6, TRUE), z = rnorm(5e6))
DIF2 <- copy(DIF)
DNC <- data.table(year = sample(as.numeric(seq_len(10)), 5e6, TRUE), id = sample(as.character(seq_len(2e5)), 5e6, TRUE), z = rnorm(5e6))
DNC2 <- copy(DNC)
DCC <- data.table(year = sample(as.character(seq_len(10)), 5e6, TRUE), id = sample(as.character(seq_len(2e5)), 5e6, TRUE), z = rnorm(5e6))
DCC2 <- copy(DCC)
DII <- data.table(year = sample(seq_len(10), 5e6, TRUE), id = sample(seq_len(2e5), 5e6, TRUE), z = rnorm(5e6))
DII2 <- copy(DII)
# key of integer, character columns
system.time(setkey(DIC, year ,id))
user system elapsed
3.21 0.11 3.31
system.time(setkey(DIC2, id, year))
user system elapsed
3.43 0.03 3.45
# key of integer factor columns
system.time(setkey(DIF, year ,id))
user system elapsed
6.31 0.05 6.37
system.time(setkey(DIF2, id, year))
user system elapsed
6.44 0.06 6.54
# key of numeric, character columns
system.time(setkey(DNC, year ,id))
user system elapsed
9.91 0.07 10.29
system.time(setkey(DNC2, id, year))
user system elapsed
10.11 0.07 10.34
# key of two character columns
system.time(setkey(DCC, year ,id))
user system elapsed
3.34 0.05 3.40
system.time(setkey(DCC2, id, year))
user system elapsed
3.40 0.02 3.42
# key of two integer columns
system.time(setkey(DII, year ,id))
user system elapsed
6.25 0.02 6.53
system.time(setkey(DII2, id,year))
user system elapsed
6.44 0.05 6.64
至於哪種方式會更好。這可能取決於你最可能經常單獨進行的子集。
例如,您可能需要獲得年1
所有數據如果您已設置的鍵year, id
那麼你可以使用
D[J(1)]
但如果鍵設置爲id, year
那麼你就需要
D[J(unique(id),1), nomatch = 0]
哪個更打字,因爲它具有計算unique(id)
將需要更長的時間。
有一個功能請求FR#1007看起來允許一個輔助鍵,但這還沒有實現。目前有一個密鑰可以佔用多個列。
非常感謝,mnel。 – AdamNYC