web-dev-qa-db-ja.com

Mongodb Aggregationフレームワークはmap / reduceよりも高速ですか?

Mongodb 2.2で集約フレームワークが導入されましたが、map/reduceよりも特別なパフォーマンスの改善はありますか?

はいの場合、なぜ、どのように、どのくらいですか?

(すでに自分でテストを行っており、パフォーマンスはほぼ同じでした)

53
Taha Jahangir

私が個人的に実行したすべてのテスト(独自のデータの使用を含む)では、集約フレームワークがmap reduceよりも高速で、通常1桁高速であることが示されています。

投稿したデータの1/10だけを取得します(ただし、OSキャッシュをクリアしてキャッシュを最初に温めるのではなく、データのページングにかかる​​時間ではなく、集計のパフォーマンスを測定するため)。

MapReduce:1,058ms
アグリゲーションフレームワーク:133ms

集計フレームワークから$ matchを削除し、mapReduceから{query:}を削除し(両方とも単にインデックスを使用するため、測定したいものではないため)、キーセット2でデータセット全体をグループ化しました。

MapReduce:18,803ms
アグリゲーションフレームワーク:1,535ms

これらは私の以前の実験とほぼ一致しています。

63
Asya Kamsky

私のベンチマーク:

==データ生成==

約350バイトで400万行(Pythonを使用)を簡単に生成します。各ドキュメントには次のキーがあります。

  • key1、key2(インデックス作成をテストする2つのランダム列、1つは2000のカーディナリティー、1つはカーディナリティーの20)
  • longdata:各ドキュメントのサイズを増やすための長い文字列
  • 値:集計をテストするための単純な数値(定数10)
_
db = Connection('127.0.0.1').test # mongo connection
random.seed(1)
for _ in range(2):
    key1s = [hexlify(os.urandom(10)).decode('ascii') for _ in range(10)]
    key2s = [hexlify(os.urandom(10)).decode('ascii') for _ in range(1000)]
    baddata = 'some long date ' + '*' * 300
    for i in range(2000):
        data_list = [{
                'key1': random.choice(key1s),
                'key2': random.choice(key2s),
                'baddata': baddata,
                'value': 10,
                } for _ in range(1000)]
        for data in data_list:
            db.testtable.save(data)
_

==テスト==

いくつかのテストを行いましたが、結果を比較するには1つで十分です。

注:キャッシュの影響を無視するために、各クエリの後にサーバーが再起動され、OSキャッシュが消去されます。

QUERY:すべての行を_key1=somevalue_(約20万行)で集計し、_key2_ごとにvalueを合計します

  • 10.6秒のマップ/縮小
  • 9.7秒を集計する
  • グループ10.3秒

クエリ:

map/reduce:

db.testtable.mapReduce(function(){emit(this.key2, this.value);}, function(key, values){var i =0; values.forEach(function(v){i+=v;}); return i; } , {out:{inline: 1}, query: {key1: '663969462d2ec0a5fc34'} })

集計:

db.testtable.aggregate({ $match: {key1: '663969462d2ec0a5fc34'}}, {$group: {_id: '$key2', pop: {$sum: '$value'}} })

グループ:

db.testtable.group({key: {key2:1}, cond: {key1: '663969462d2ec0a5fc34'}, reduce: function(obj,prev) { prev.csum += obj.value; }, initial: { csum: 0 } })

7
Taha Jahangir