18

パッケージを使用するときdata.table、いつ必要なのか少しわかりませんsetkey()。たとえば:=、オプションで演算子を使用するとby、キーを設定していなくても、非常に高速に動作するように見えます。必要な場合とそうでない場合を誰かが説明setkey()してもらえますか? そして、呼び出す前にそれが必要ない場合:=、パッケージbyはどのように高速なのですか。おそらく、 myが実際にあるかどうかがわからないため、バイナリ検索ではなくシーケンシャル検索を実行することにより、標準の Rdata.tableと同じことを行う必要があるためです。への引数でソートされます。applydata.framedata.tableby

ありがとう

4

1 に答える 1

19

次の 2 つの FAQ が近いようです。

3.2 大きなテーブルにキーはありませんが、グループ化は非常に高速です。何故ですか?
data.table基数ソートを使用します。これは、他のソート アルゴリズムよりも大幅に高速です。基数は特に整数専用です。 を参照してください?base::sort.list(x,method="radix")setkeyこれも速い理由の一つです。キーが設定されていない場合、またはキーの順序とは異なる順序でグループ化されている場合、それを ad hoc by と呼びます。

3.3 キーの列によるグループ化がアドホックなグループ化よりも速いのはなぜですか? 各グループは RAM で連続しているため、ページのフェッチが最小限に抑えられ、C でループするのではなく、
メモリを一括で (C で) コピーできます。memcpy

それが言っていないこと、そしておそらくすべきことは、キーイングとアドホックの違いに気付く前に、各グループも非常に大きい非常に大きなデータセットが必要だということです。1e8行と13列など、それぞれ100MBの100グループ(10GBのdata.table)のようなもの。setkeyそれ以外の場合は、特に面倒になる可能性があるため、最初にする必要はありません。

于 2012-07-20T18:42:53.893 に答える