0

我想知道Spring Mongo APIfind所有内容加载到List. 如果搜索结果包含十亿条记录,会不会影响内存?有人可以建议一种更好的方法来实现这一点,而无需将所有这些都加载到内存中。使用 limit 会有所帮助,但存在一个缺陷,即它不知道是否将新文档插入到集合中。X of billion好吧,如果集合在读取记录后进行了修改,则 find by limit 将具有相同的效果。

所以两个问题:

  • 通过不在内存中加载所有内容来提高性能
  • 您将如何解决在处理过程中添加的这个未知文档?

来自 API 的代码

List<T> result = new ArrayList<T>();

while (cursor.hasNext()) {
    DBObject object = cursor.next();
    result.add(objectCallback.doWith(object));
}
4

1 回答 1

1

通过不在内存中加载所有内容来提高性能

搜索结果的相应用户界面通常会限制需要显示的结果数量(例如,每页的结果以及整体结果)。我认为没有任何合理的用例可以将无限的结果集加载到内存中,但一个好的保护措施是在您的应用程序查询中包含一个合理的限制。

MongoDB 服务器以不能超过最大 BSON 文档大小的游标批次返回查询结果(在 MongoDB 3.0 中为 16MB .. 实际上通常第一批次为 1MB,后续批次为 4MB)。您可以通过继续在应用程序代码中迭代光标来构建更大的结果,但实现是您的选择。

您将如何解决在处理过程中添加的这个未知文档?

按单调递增的新文档的属性对搜索结果进行排序——例如,默认生成的 ObjectId。游标(在 MongoDB 3.0 中)不提供与写入活动的隔离,因此如果适用于查询顺序,在处理期间插入或更新的文档也将包括在内。

如果您的代码正在迭代按(升序)排序的大型查询_id,则使用默认 ObjectId 插入的新文档应该出现在最后一批中。

于 2015-06-24T01:06:40.187 回答