gpt4 book ai didi

python - 使用分页的 PyMongo 中光标太大的 MemoryError

转载 作者:行者123 更新时间:2023-12-01 09:25:31 25 4
gpt4 key购买 nike

我有一个正在尝试分页的对象光标。我想要的总项目数是 25,但 Django 分页的工作方式需要 整个 光标。在私有(private)测试中,大概是因为我的家庭盒子有更多的内存等,我没有这些问题。然而,当推送到只有 2GB 内存的生产机器时,我收到一个 MemoryError,大概是因为光标太大。

我可以使用 .limit(25) 和 .skip() 一次只检索 25 个内容,但是为了使分页正常工作,我需要对象的总数。不幸的是,.count() 似乎需要获取光标的整个数据。理想情况下,如果我能以某种方式获取查找的大小并且仅从光标中获取 25 个实际对象,我就可以完成这项工作。

所以我想问题是,有没有一种方法可以不通过 .count() (获取整个光标的数据)来获取光标的大小。

lookup = players.find({field: {'$exists': True}}).sort(field, DESCENDING)
//This returns a MemoryError

lookup = players.find({field: {'$exists': True}}).limit(25).skip(25).sort(field, DESCENDING)
//This does NOT return a Memory Error. However, when I do the following:

lookup.count()
//This also has a MemoryError.

为了澄清起见,我使用的是 Django 1.5.11 和 pymongo 3.2.1。

最佳答案

通常建议使用 range queries 而不是使用 skip()limit() 进行分页。 。这是因为:

  • skip()limit() 必须迭代游标并丢弃结果,这意味着您做了很多不必要的工作。
  • 索引不支持
  • skip()limit()
  • 索引可以非常高效地提供范围查询。

例如,您可以使用一系列键来代替 skip()limit()。以id字段为例,假设id字段是一个递增的数字:

db.collection.find({id: {$gte: 0, $lt: 25}, field: {'$exists': True}})

然后您可以创建 compound index id:1, field:1,例如:

db.collection.createIndex({id:1, field:1})

这将使分页受到索引的支持,因此它快速高效,而无需做任何不必要的工作。

关于python - 使用分页的 PyMongo 中光标太大的 MemoryError,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50436845/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com