7

Year(10レベル)とMemberID(200,000レベル)の2つのキーを持つdata.tableがあります。setkeyを実行setkey(MemberID, Year)すると、パフォーマンスが異なりsetkey(Year, MemberID)ますか?もしそうなら、どちらの方法が良いでしょうか?

4

1 に答える 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 に答える