Year(10レベル)とMemberID(200,000レベル)の2つのキーを持つdata.tableがあります。setkeyを実行setkey(MemberID, Year)
すると、パフォーマンスが異なりsetkey(Year, MemberID)
ますか?もしそうなら、どちらの方法が良いでしょうか?
質問する
246 次
1 に答える
8
キー設定のパフォーマンスと速度は、キー変数の型によって異なります。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がありますが、これはまだ実装されていません。現在、複数の列を占有できる単一のキーがあります。
于 2012-12-04T01:22:43.143 に答える