55

集約フレームワークは mongodb 2.2 で導入されましたか? map/reduce よりもパフォーマンスが特別に向上していますか?

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

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

4

2 に答える 2

66

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

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

MapReduce: 1,058ms
集約フレームワーク: 133ms

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

MapReduce: 18,803ms
集約フレームワーク: 1,535ms

それらは私の以前の実験と非常に一致しています。

于 2012-12-17T10:15:05.657 に答える
8

私のベンチマーク:

== データ生成 ==

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

  • key1、key2 (インデックス作成をテストするための 2 つのランダムな列、1 つはカーディナリティが 2000、もう 1 つはカーディナリティが 20)
  • longdata: 各ドキュメントのサイズを大きくするための長い文字列
  • 値: 集計をテストするための単純な数値 (const 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)
合計データサイズはmongoで約6GBでした。(および postgres では 2GB)

== テスト ==

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

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

クエリ: すべての行をkey1=somevalue(約 200K 行) で集計valueし、それぞれを合計します。key2

  • マップ/リデュース 10.6 秒
  • 集計 9.7 秒
  • グループ 10.3 秒

クエリ:

マップ/リデュース:

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 } })

于 2012-12-17T09:23:15.767 に答える