次の投稿: multicore and data.table in Rで、data.table を使用するときにすべてのコアを使用する方法があるかどうか疑問に思っていました。通常、グループごとの計算を並列化できます。plyr
設計上、このような操作が許可されているようです。
3 に答える
最初に確認することは、data.table
FAQ 3.1 ポイント 2 が沈んでいることです。
最大のグループのみに 1 つのメモリ割り当てが行われ、そのメモリが他のグループに再利用されます。収集するゴミはほとんどありません。
これが、data.table のグループ化が速い理由の 1 つです。しかし、このアプローチは並列化には向いていません。並列化とは、データを他のスレッドにコピーすることを意味し、代わりに時間がかかります。しかし、私の理解では、data.table
グループ化は通常、とにかく on よりも高速plyr
です.parallel
。各グループのタスクの計算時間と、その計算時間を簡単に削減できるかどうかによって異なります。多くの場合、データの移動が優先されます (1 回または 3 回の大規模なデータ タスクの実行をベンチマークする場合)。
j
多くの場合、これまでのところ、実際には の式に噛み付いているのは落とし穴です[.data.table
。たとえば、最近、グループ化によるパフォーマンスの低下が見られましたが、原因は( R で 80K を超える一意の ID を集約data.table
すること) であることが判明しました。その問題を回避することで、50 倍以上のスピードアップが得られました。min(POSIXct)
したがって、マントラは次のとおりです 。 Rprof
, Rprof
, Rprof
.
さらに、同じ FAQ のポイント 1 が重要な場合があります。
その列のみがグループ化され、他の 19 列は無視されます。これは、data.table が j 式を検査し、他の列を使用していないことを認識しているためです。
したがって、data.table
実際には、分割適用結合パラダイムにはまったく従いません。動作が異なります。split-apply-combine は並列化に適していますが、実際には大規模なデータには対応していません。
data.table のイントロ ビネットの脚注 3 も参照してください。
ベクトルスキャンであるコードに並列技術を展開している人は何人いるのだろうか
それは、「確かに、並列処理は大幅に高速ですが、効率的なアルゴリズムでは実際にどのくらいの時間がかかるのでしょうか?」と言おうとしています。
しかし、 ( を使用して) プロファイリングしRprof
、グループごとのタスクが実際に計算集約型である場合は、「マルチコア」という単語を含む datatable-help の 3 つの投稿が役立つ場合があります。
もちろん、data.table で並列化がうまくいくタスクはたくさんありますし、それを行う方法もあります。しかし、通常は他の要因が影響するため、まだ実行されていないため、優先度は低くなります。ベンチマークと Rprof の結果を含む再現可能なダミー データを投稿できれば、優先順位を上げるのに役立ちます。