2017-10-02 40 views
0

多くのドキュメント(> 100M)をクエリする必要があり、5000ドキュメント(それぞれ4-5MB)のバッチで要求しています。 何らかの理由により、 の残りがかなりの時間(〜8〜9.5秒)かかる間、最初の要求(_idフィルタリングなし)はすぐに戻ります(〜1.5s)。最初の読み込み後にMongoDBの読み込みが遅くなる

500個のドキュメント(それぞれ~500kB)のバッチを読み込むと、タイミングが大幅に改善され(約0.5-0.8秒)、すべてのリクエストで一貫しています。

私がskip + limitメソッドがはるかに悪化しているのを見て、_id + limitページネーションの方法を使用しています。

ここに私のプロセスのサンプルがあります。

var mongodb = require("mongodb") 
var bytes = require("bytes") 

... 

var filter = { 
    '_id': { '$gt': this._lastId } 
} 

if(mongodb.ObjectId.isValid(this._lastId)) { 
    filter['_id'] = { '$gt': this._lastId } 
} 

var cursor = this.conn.collection(collectionName) 
    .find(filter) 
    .limit(5000) 

var start = new Date().getTime() 
cursor.toArray(function(err, docs) { 
    if (err) { ... } 

    var elapsed = (new Date().getTime() - start)/1000 

    console.log(
     "Docs:", docs.length, 
     "Size:", bytes(sizeof(docs)), 
     "Took:", elapsed + " seconds" 
    ) 

    var lastDoc = docs[docs.length - 1] 

    this._lastId = lastDoc._id 
}) 

... 
+0

バッチサイズが250〜500の場合は、最良の結果が得られます。 5000のバッチはあまりにも多く、MongoDBドライバは内部的に1000の最大サイズにそれを分解します。 – Saleem

答えて

0

私は、問題は興味深い見つけ、それを再現しようとしたと同じ結果になりました:5000へのid 0から最初の呼び出しが高速であり、他のすべては、一貫して長い(約7倍)

このフィルタなしで読むことに関連しています。 mongoシェルであなたのコマンドを実行し、あなたの発見を説明すれば、0から5000まで読み込むときにフィルターが適用されないことがわかります。.batchSize()を使用すると、一度に多くの文書を取得することができます()。あなたの数字、各文書は約1KBです)。デフォルトはカーソルの反復ごとに20です。 .toArray()関数を実行すると、5000ドキュメントが転送されるまでMongoDBからアプリケーションに20KBのチャンクが送信されます。より大きなバッチを使用するように最適化されているかもしれませんが、異なる値を試す必要がありますが、500KBから一度に500KBを取得すると、ネットワークオーバーヘッドが小さくなります。 cursor.forEach()は、(batchsize(n)のチャンクによって)処理されたデータを転送するときに、よりうまく機能することがあります。この場合、最終的にすべての文書を検査したい場合は、コレクション全体または5000のチャンクを照会することは大したことではありません。

カーソルは接続を開いたままにして、DBへのカーソルまたは接続を閉じるまでMongoDBサーバー上のリソースを割り当てますが、カーソルはバッチのデータを保持するだけのサイズにはなりません。

私は、小さなバッチを行う方が速くないと主張します。ドキュメントあたりの時間は似ていますが、ドキュメントの10倍も少なくても約10倍高速です。

+0

小さなバッチでも同じことを実現しましたが、システムのメモリでは、より小さなバッチがよりうまく機能するかもしれません。 'cursor.batchSize()'の使い方について詳しく説明できますか?私はそれに慣れていない。それはすぐに消耗するまで開いた接続を維持しますか? 100M以上のドキュメントでは、時間がかかります –

+0

は回答を編集します –

関連する問題