20

私はRユーザーですが、大きなデータセット(数千万行)をサブセット化する必要がある関数を作成する必要があることがよくあります。このような関数を多数の観測に適用する場合、実装方法に注意しないと非常に時間がかかる可能性があります。

これを行うために、data.tableパッケージを使用することがあります。これにより、データフレームを使用したサブセット化よりもはるかに高速になります。最近、私はRMySQLのようなパッケージの実験を開始し、いくつかのテーブルをmysqlにプッシュし、そのパッケージを使用してsqlクエリを実行して結果を返しました。

パフォーマンスの改善が混在していることがわかりました。小さいデータセット(数百万)の場合、データをdata.tableにロードし、適切なキーを設定すると、サブセット化が高速になるようです。より大きなデータセット(数千から数億)の場合、mysqlへのクエリの送信はより速く移動するように見えます。

どの手法が単純なサブセット化または集計クエリをより速く返す必要があるか、そしてこれがデータのサイズに依存するかどうかについて誰かが洞察を持っているかどうか疑問に思っていましたか?data.tableにキーを設定することは、インデックスを作成することにいくぶん似ていることを理解していますが、それ以上の直感はありません。

4

2 に答える 2

32

データがRAMに収まる場合、data.tableの方が高速です。例を提供すると、data.tableを不適切に使用していることがすぐに明らかになります。data.table wikiの「すべきこととすべきでないこと」を読んだことがありますか?

SQLは行ストアであるため、下限があります。データがRAMに収まる場合(そして64ビットはかなりの量です)、data.tableは、RAMにあるだけでなく、列がメモリ内で連続しているため(列操作のためにRAMからL2へのページフェッチを最小限に抑える)、より高速になります。data.tableを正しく使用すると、SQLの下限よりも高速になります。これはFAQ3.1で説明されています。data.tableの処理速度が遅い場合は、data.tableを誤って使用している可能性が非常に高くなります(または、修正が必要なパフォーマンスのバグがあります)。したがって、data.table wikiを読んだ後、いくつかのテストを投稿してください。

于 2011-07-06T09:27:17.903 に答える
3

私はRユーザーではありませんが、データベースについては少し知っています。MySQL(または他の評判の良いRDBMS)は、サブセット化プロセスに関連する追加の計算を除いて、実際にサブセット化操作をより高速に(通常、1桁程度)実行すると思います。

小さなデータセットでのパフォーマンスの遅れは、MySQLへの接続とデータの最初のプッシュの費用に関連していると思われます。接続のオーバーヘッドとデータ転送時間により、MySQLが節約できるよりも操作のコストが増える可能性があります。

ただし、特定の最小値よりも大きいデータセットの場合、このコストはデータベースの速度によって補われるように思われます。

私の理解では、SQLは、コード内の反復操作よりもはるかに迅速に、ほとんどのフェッチおよびソート操作を実行できます。ただし、接続のコストと(この場合)ネットワークワイヤを介したデータの初期転送を考慮に入れる必要があります。

他の人の言うことを聞きたいです。。。

于 2011-07-06T01:40:53.143 に答える