我有一个关于 MongoDB 结果的一般性问题:假设我有一万亿个结果,我想使用 Casbah 驱动程序拆分这些结果,即使使用 limit 命令,我似乎仍然会得到 OutOfMemoryErrors。除了通过使用限制拆分它们并懒惰地点击下一页之外,是否有关于如何处理巨大结果集的一般建议?
或者甚至可以以一种方式使用视图来轻松处理这个过程?
是否有某种魔术技巧可以使它更容易一些?
问候,
斯特凡
好的,
这不是一个直接的解决方案,但一般来说大游标的问题是它们最终将成为 IO 绑定。
所以我添加了在应用程序中对结果进行分页的功能:
在结果之间循环(向前和向后)我使用以下方法:
def findPagesWithGreaterId(pageid: String, limit: Int): List[Page] =
findAsListSortedLimit(MongoDBObject("_id" -> MongoDBObject("$gt" -> new ObjectId(pageid))), MongoDBObject("_id" -> 1), limit)
/**
* finds a slice of pages with a smaller id (required for paging)
*/
def findPagesWithSmallerId(pageid: String, limit: Int): List[Page] =
findAsListSortedLimit(MongoDBObject("_id" -> MongoDBObject("$lt" -> new ObjectId(pageid))), MongoDBObject("_id" -> 1), limit)
/**
因此,无论您做什么,都应该将光标大小限制在第一位,因为大光标总是会导致性能不佳。
这当然不是我想要的优雅解决方案。