Mongodb から約 50,000 件のレコードを取得しようとしていますが、クエリを実行すると Java のヒープ領域が不足し、サーバーがクラッシュします。
以下は私のコードです。
List<FormData> forms = ds.find(FormData.class).field("formId").equal(formId).asList();
mongodb からバッチ処理でレコードを取得するために構文的に助けてくれる人はいますか。
前もって感謝します
Java 実装にこれがあるかどうかはわかりませんが、c# バージョンには setBatchSize メソッドがあります。
それを使って私ができること
foreach(var item in coll.find(...).setBatchSize(1000)) {
}
これにより、一致するすべてのアイテムが取得されますが、一度にすべて取得されるのではなく、バッチごとに 1000 個ずつ取得されます。この「バッチ処理」はすべて列挙内で処理されるため、コードには表示されません。ループが 1001 アイテムを取得しようとすると、別のバッチが mongodb サーバーから取得されます。
これにより、ヒープ領域の問題が軽減されます。
http://docs.mongodb.org/manual/reference/method/cursor.batchSize/
ループ内で何をするかによっては、まだ他の問題が発生する可能性がありますが、それはあなたの管理下にあります。
50k エントリを取得することは、どのデータベースでも良い考えのようには思えません。ユースケースによっては、クエリを変更したり、limit と offsetを使用したりする必要がある場合があります。
ds.find(FormData.class)
.field("formId").equal(formId)
.limit(20).offset(0)
.asList();
範囲ベースのクエリは、制限とオフセットを使用するよりも効率的であることに注意してください。