私はこの議論を見つけました: MongoDB:Terrible MapReduce Performance 。基本的には、MongoのMRクエリはシングルスレッドであり、リアルタイムではないため、回避するように指示されています。 2年が経ちましたが、それから何が変わったのでしょうか。これでMongoDb2.2ができました。 MRはマルチスレッドになっていると聞きました。 Webアプリケーションの頻繁なhttpリクエストのデータをフェッチするなど、リアルタイムリクエストのMRの使用に関するアイデアを共有してください。インデックスを有効に活用できますか?
MongoDBのMap/Reduceの機能の現在の状態は次のとおりです
1)Map/Reduceのパフォーマンス制限のほとんどは、MongoDBバージョン2.2のままです。 Map/Reduceエンジンでは、すべてのレコードをBSONからJSONに変換する必要があり、実際の計算は組み込みのJavaScriptエンジン(低速)を使用して実行されます。また、単一のグローバルJavaScriptロックがあり、単一のJavaScriptスレッドのみが許可されます。一度に実行します。
シャードクラスターのMap/Reduceにいくつかの段階的な改善がありました。最も注目すべきは、最終的なリデュース操作が複数のシャードに分散され、出力も並行してシャーディングされることです。
MongoDBバージョン2.2でのリアルタイム集計にMap/Reduceをお勧めしません
2)MongoDB 2.2以降、新しいアグリゲーションフレームワークが追加されました。これは、C++で記述され、MongoDBフレームワークに緊密に統合された集約操作の新しい実装です。
ほとんどのMap/Reduceジョブは、AggregationFrameworkを使用するように書き直すことができます。これらは通常、より高速に実行され(バージョン2.2ではMap/Reduceに対して20倍の速度向上が一般的です)、既存のクエリエンジンを最大限に活用し、複数の集計コマンドを並行して実行できます。
リアルタイムの集約要件がある場合、最初に開始するのは集約フレームワークです。集約フレームワークの詳細については、次のリンクを参照してください。
3)MongoDBバージョン2.4のMap/Reduceが大幅に改善されました。 SpiderMonkeyJavaScriptエンジンはV8JavaScriptエンジンに置き換えられ、グローバルJavaScriptロックはなくなりました。つまり、複数のMap/Reduceスレッドを同時に実行できます。
Map/Reduceエンジンは、次の2つの主な理由により、集約フレームワークよりもかなり低速です。
集約フレームワークがコンパイルされたC++コードを実行している間、JavaScriptエンジンは解釈されます
JavaScriptエンジンでは、検査対象のすべてのドキュメントをBSONからJSONに変換する必要があります。出力をコレクションに保存する場合は、結果セットをJSONからBSONに変換して戻す必要があります
2.4と2.6の間でMap/Reduceに大きな変更はありません。
MongoDBバージョン2.4または2.6でリアルタイム集計にMap/Reduceを使用することはまだお勧めしません。
4)Map/Reduceが本当に必要な場合は、Hadoopアダプターを確認することもできます。ここに詳細があります: