1

私は現在、多くの比較的小さなデータセットに対して多くの統計計算を実行することを含むプロジェクトに取り組んでいます。これらの計算の中には、移動平均を計算するのと同じくらい単純なものもあれば、スピアマンのRhoやKendellのTauの計算のように、少し多くの作業が必要なものもあります。

データセットは基本的に、辞書にパックされた一連の配列であり、そのキーは、サブセットに関する詳細情報を提供するMongoDbのドキュメントIDに関連しています。ディクショナリ内の各配列には、100個以下の値があります。ただし、辞書は無限に大きくなる可能性があります。ただし、実際には、毎年約150の値が辞書に追加されます。

mapreduceを使用して、必要なすべての計算を実行できます。または、分散システムでCeleryとRabbitMQを使用して、Pythonで同じ計算を実行することもできます。

私の質問はこれです:どの道が最も推奨されるか、またはベストプラクティスですか?

ここにいくつかの追加情報があります:

  1. 各データセットのメトリックを計算するスクリプトを作成するプロセスを開始したばかりなので、まだ何もベンチマークしていません。
  2. celery / rabbitmq分散キューを使用すると、Mongoデータベースに対して行われるクエリの数が増える可能性があります。
  3. 同時タスクの数が非常に多くない限り、どちらの方法のメモリ使用量も問題になるとは思いません。タスク自体の大部分は、データセット内のアイテムを取得し、それをロードし、計算を実行してから解放するだけです。したがって、データセット内のデータ量が非常に多い場合でも、一度にすべてのデータがメモリに読み込まれるわけではありません。したがって、私の考えでは、制限要因は、mapreduceまたはキューに入れられたシステムが計算を実行できる速度に帰着します。さらに、それは同時タスクの数に依存します。

ご協力いただきありがとうございます!

4

1 に答える 1

0

確かにベンチマークなしで言うことは不可能ですが、私の直感は、mapreduceではなくPythonでより多くの計算を行うことに傾いています。私の主な懸念は、mapreduceがシングルスレッドであるということです。1つのMongoDBプロセスは、一度に1つのJavascript関数しか実行できません。ただし、同時に何千ものクエリを処理できるため、複数のPythonプロセスからMongoDBにクエリを実行することで、その同時実行性を利用できます。

于 2012-08-22T18:51:33.447 に答える