我正在尝试从 Mongodb 中检索记录,其计数约为 50,000,但是当我执行查询时,Java 耗尽了堆空间并且服务器崩溃了。
以下是我的代码;
List<FormData> forms = ds.find(FormData.class).field("formId").equal(formId).asList();
任何人都可以帮助我在语法上从 mongodb 批量获取记录。
提前致谢
我不确定 Java 实现是否有这个,但在 c# 版本中有一个 setBatchSize 方法。
使用我可以做的
foreach(coll.find(...).setBatchSize(1000) 中的变量项) {
}
这将获取 find 匹配的所有项目,但它不会一次获取所有项目,而是每批 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();
请注意,基于范围的查询比使用限制和偏移更有效。