3

mongodb で最大 1 億 2000 万のレコードに対してクエリを実行しています。クエリは、mongo シェルと Java ドライバーの両方を使用してすばやく実行されますが、Java ドライバーを介して結果を json オブジェクトに変換しようとすると、非常に遅くなります (クエリには 100 ミリ秒未満かかりますが、json への変換には 30 秒以上かかります)。 . 結果セットには約 5k の項目があります。で変換していJSON.serialize(cursor)ます。

json文字列に変換するには少し時間がかかると思いますが、シェルからクエリを実行すると、

var cursor = //execute query
var arr = cursor.toArray();
arr

それは非常に速く印刷されます。

mongo サーバーの統計では、シリアル化プロセス中にページ フォールトの数が増加していると報告されていますが、RAM を増やして、コレクション全体とインデックスよりもはるかに大きくしました。

ここで何が起こっているのか、そしてjsonへの変換速度を向上させる方法について何か考えはありますか?

4

2 に答える 2

2

カーソルを取得したときにクエリは実行されませんでした。実行されたとしても、結果のごく一部しか取得できませんでした。

toArray()一般に、メモリ内の文字列を使用またはシリアル化して、すべての結果をメモリにロードしないことをお勧めします。50K のドキュメントはクライアント側のメモリを大量に消費するだけであり、そのメモリの割り当てもあまり効率的ではありません。

第 10 世代の Java ドライバーに行き詰まっている場合は、ストリーミング書き込み機能のためにJAVA-709が解決されるまで待つ必要があります。Asynchronous Java Driverは、ストリームへの書き込み機能をサポートしています。

外部プログラムを使用できる場合は、mongoexportを参照してください。JSON をファイルまたは stdout に書き出すことができ、最適なパフォーマンスに近いはずです。

クエリを初めて実行するときは、ページ フォールトは正常です。2 回目は、データ セット全体をメモリに保持するのに十分なメモリがサーバーにあれば、ページ フォールトはほとんど発生しません。サーバーと同じマシンでクライアントを実行している場合、データをメモリからプッシュして、JSON BLOB 用にクライアントに必要なメモリを割り当てることができます。

HTH - ロブ

于 2013-04-16T03:13:20.007 に答える