我想知道Spring Mongo API
find
加载List
中的所有内容。如果搜索结果包含十亿条记录,是否会影响内存?有人可以建议一种更好的方法来实现这一点,而无需将所有这些加载到内使用限制可以帮助但是有一个缺陷,它不知道是否在集合中插入了新文档。好吧,如果在阅读X of billion
条记录之后修改了集合,则按限制查找会产生相同的效果。
所以有两个问题:
API的代码
List<T> result = new ArrayList<T>();
while (cursor.hasNext()) {
DBObject object = cursor.next();
result.add(objectCallback.doWith(object));
}
答案 0 :(得分:1)
通过不将所有内容加载到内存中来提高性能
搜索结果的相应用户界面通常会对需要显示的结果数量进行限制(例如,每页结果以及整体结果)。我认为没有任何明智的用例可以将无限制的结果集加载到内存中,但一个很好的保护措施是在应用程序查询中包含合理的限制。
MongoDB服务器返回cursor batches中不能超过maximum BSON document size的查询结果(MongoDB 3.0中为16MB,实际上第一批通常为1MB,后续批次为4MB)。您可以通过继续在应用程序代码中迭代光标来构建更大的结果,但实现是您的选择。
您如何解决处理过程中添加的未知文件?
按单调增加的新文档属性对搜索结果进行排序 - 例如,默认生成的ObjectId。游标(与MongoDB 3.0一样)不提供与写活动的隔离,因此如果适用于查询顺序,也将包括在处理期间插入或更新的文档。
如果您的代码正在迭代按_id
(升序)排序的大型查询,则使用默认ObjectId插入的新文档应出现在最后一批中。