4

非常に長いベクトルを保持する何千ものレコードを持つmongodbがあります。特定のアルゴリズムを使用して、入力ベクトルとMDBデータセットとの相関関係を探しています。

疑似コード:

function find_best_correlation(input_vector)
    max_correlation = 0
    return_vector = []
    foreach reference_vector in dataset:
        if calculateCorrelation(input_vector,reference_vector) > max_correlation then:
            return_vector = reference_vector
    return return_vector

計算が実行される順序は気にしないので、これはmap-reduceパターンの非常に良い候補です。

問題は、私のデータベースが1つのノード上にあることです。多くのマッピングを同時に実行したい(8コアのマシンを使用しています)

私が理解していることから、MongoDbはノードごとに1つの実行スレッドのみを使用します。実際には、データセットをシリアルに実行しています。これは正しいです?

もしそうなら、map-reduceの実行ごとにプロセス/スレッドの数を構成できますか?map-reduceを並行して実行している複数のスレッドを管理してから結果を集計すると、パフォーマンスが大幅に向上します(誰かが試したことはありますか?)。そうでない場合-同じノードにDBの複数のレプリケーションを配置し、mongoDbを2つのレプリケーションで実行するように「トリック」することはできますか?

ありがとう!

4

1 に答える 1

7

MongoDBのMapreduceは、シングルスレッドのJavascriptエンジンであるSpidermonkeyを使用するため、複数のプロセスを構成することはできません(「トリック」はありません)。マルチスレッドJSエンジンを使用するためのJIRAチケットがあります。これは、 https ://jira.mongodb.org/browse/SERVER-2407でフォローできます。

可能であれば、新しい集計フレームワーク(MongoDBバージョン2.2で利用可能)を検討することを検討します。これは、JavascriptではなくC ++で記述されており、パフォーマンスが向上する可能性があります:http: //docs.mongodb.org/manual/applications/aggregation/

于 2012-07-31T22:08:54.703 に答える