私は年(10レベル)とメンバーID(200000レベル)の2つのキーを持つdata.tableを持っています。私がsetkeyを実行したとき、setkey(MemberID, Year)
の結果はsetkey(Year, MemberID)
と異なるパフォーマンスになりますか?もしそうなら、どちらの方が良いでしょうか?data.tableのキーの順序は重要ですか?
7
A
答えて
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
。これはおそらくあなたが最も頻繁にサブセット化する可能性の高いものに依存します。
たとえば、あなたがyear, id
としてキーを設定している場合は、キーがid, year
としたならば、あなたは
D[J(1)]
しかしを使用することができます年1
のすべてのデータを取得する必要があるかもしれませんあなたはより多くのタイピングであり、それはunique(id)
を計算する必要があるため、時間がかかりますどの
D[J(unique(id),1), nomatch = 0]
が必要になります。
二次キーを許可する機能リクエストFR#1007がありますが、まだ実装されていません。現在、複数の列を占めることができる単一のキーがあります。
関連する問題
- 1. 複合キーの順序は重要ですか?
- 2. メンバーの順序、派生の順序は重要ですか?
- 3. キャッチブロックの順序は重要ですか?
- 4. MongoDB BSON docでキーの順序が重要ですか?
- 5. SQLの列の順序は重要ですか?
- 6. クエリの列の順序は重要ですか?
- 7. ページ内のjavascriptの順序は重要ですか?
- 8. カーネルビルドのメイクファイルのターゲット順序は重要ですか?
- 9. なぜデータメンバーの破壊の順序は重要ですか?
- 10. LibSVM機能ベクトルの機能の順序は重要ですか?
- 11. テーブル内の列の順序は重要ですか?
- 12. URLの順序はXMLサイトマップで重要ですか?
- 13. Sedコマンド - オプションフラグの順序は重要ですか? (-ir vs -ri)
- 14. VB.Netコンストラクタの順序は重要ですか?
- 15. MySQL 5:GROUP BYフィールドの順序は重要ですか?
- 16. 仮想テーブルの順序は重要ですか?
- 17. 結合順序はSQLで重要ですか?
- 18. CSSでメディアクエリの順序が重要なのはなぜですか?
- 19. JOINのON句で参照されるテーブルの順序は重要ですか?
- 20. 静的イニシャライザで宣言の順序が重要なのはなぜですか?
- 21. MySQLでLEFT JOINの順序が重要なのはなぜですか?
- 22. クラスのメソッド宣言の順序はコンパイラにとって重要ですか?
- 23. rm -rf(-rf -fr)の文字RとFの順序は重要ですか?
- 24. GNUリンカの-lオプションと-Lオプションの順序は重要ですか?
- 25. ウィジェットの作成順序が重要なのはなぜですか?
- 26. Spring XMLにおけるリソースのインポート順序は重要ですか?
- 27. 配列内でのキーの順序
- 28. ViewEngineの登録順序が重要でない理由
- 29. 明示的なLINQ-to-SQL(C#)では順序が重要ですか?
- 30. xmlパターンの正当な理由は、「要素の順序は重要です」というルールですか?
ありがとう、mnel。 – AdamNYC