1

私は、何千ものJPEG画像をユーザーに提供することになっているasp.netWebアプリを開発しています。私の専用サーバーにはJPEGファイルが含まれており、JPEGメタデータを保存するためにMongoDBをホストしています。

Sample object in a collection named **JPEG_123** (this collection has 1 million such documents and each document has _id indexed)
{ 
    "_id" : "20121210185015000", //YYYYMMDDhhmmsslll 
    "Url" : "http:...", 
    "CameraId" : 123 
}

Webメソッドを使用してMongoDBにクエリを実行しています。コレクションJPEG_123に正規表現(例: "^ 2012121018 * /)を使用してUtcフィールドをクエリし、1時間のドキュメントを取得します。MongoCursorが指す約5000レコードが返され、MongoShellではこのデータを取得するのに3〜4ミリ秒の時間が表示されます。 。

Q. MongoCursorを介してASP.NETで最良かつ迅速な方法で、MongoDBからこれらのドキュメントを繰り返し取得するにはどうすればよいですか?MongoCursorの属性のようなLIMIT、BATCHSIZE、およびNEXTを最適に使用します。

私はこのようなことをしようとしています:

  • ASP.NETからMongoDBで上記の検索クエリを実行します
  • 最初にネットワーク経由で最初の500ドキュメントのみをフェッチし、残りの4500をRAMに保持します
  • 後続の9回の反復でそのMongoCursor内の残りの4500ドキュメントをフェッチします(毎回500を取得します)
  • または、ネットワークを介してこのデータを送信するこのプロセスを高速化するその他の可能性

私の懸念

  1. ASP.NETからMongnoDBにクエリを実行すると、MongoDBは5000レコードすべてをRAMにロードしますが、5000レコードすべてをASP.NETに返さないということですか?

  2. 上記のクエリを発行すると、MongoCursorが指すレコードの総数が即座に返されます。MongoCursorのすべてのドキュメントをループすると、約20〜30秒かかります。つまり、MongoDBは、アプリケーションで使用されたときにデータを返しますか?

4

1 に答える 1

0

コレクションのインデックスが非常に適切でない限り、セットサイズが大きいカーソルの使用は非常に遅くなることがわかりました。ほとんどの場合、正規表現はインデックスの使用を排除していることに注意してください。可能な限り、インデックスの使用を避けるようにしてください。

デフォルトでは、カーソルはバッチごとに101のドキュメントまたは1MBのデータを返します。コレクションの統計を見て平均的なドキュメントのサイズを判断できる場合は、それを活用して最適な制限を設定できます。これらの制限をある程度拡張するために、カーソルオブジェクトで操作できる設定もあります。

書き込みは読み取りに比べてすでに遅いので、私が提案するかもしれないことの1つは、それらのUTC文字列を日付フィールドとして渡し、Mongoにそれらを解析させることです。このようにして、フィールドにインデックスを付け、クエリで通常の日付範囲の比較を使用できます。

于 2012-12-20T20:51:14.533 に答える