我正在尝试从Mongodb中检索记录,其数量大约为50,000,但是当我执行查询时,Java会耗尽堆空间并且服务器崩溃。
以下是我的代码;
List<FormData> forms = ds.find(FormData.class).field("formId").equal(formId).asList();
任何人都可以从语法上帮助我从mongodb批量获取记录。
提前致谢
答案 0 :(得分:1)
我不确定Java实现是否有这个,但在c#版本中有一个setBatchSize方法。
使用我可以做的
foreach(coll.find(...)中的var项.setBatchSize(1000)){
}
这将获取查找匹配的所有项目,但不会一次获取所有项目,而是在每批次中获取1000。您的代码将不会看到此“批处理”,因为它都在枚举中处理。一旦循环尝试获取1001项,将从mongodb服务器获取另一个批处理。
这应该可以减少堆空间问题。
http://docs.mongodb.org/manual/reference/method/cursor.batchSize/
根据你在循环中的操作,你仍然可能有其他问题,但这将由你掌控。
答案 1 :(得分:0)
获取50k条目对任何数据库来说都不是一个好主意。 根据您的使用情况,您可能希望更改查询或使用limit and offset:
ds.find(FormData.class)
.field("formId").equal(formId)
.limit(20).offset(0)
.asList();
请注意,基于范围的查询比使用限制和偏移更有效。