【问题标题】:Is this possible to lazily query the database with mongoengine (python)?这可以用 mongoengine (python) 懒惰地查询数据库吗?
【发布时间】:2012-03-23 14:53:21
【问题描述】:

mongoengine(在 python 中)存在内存问题。

假设我有大量的 custom_documents(几千个)。 我想处理它们,像这样:

for item in custom_documents.objects():
    process(item)

问题是custom_documents.objects() 加载内存中的每个对象,而我的应用程序使用了几个 GB ...

我怎样才能让它更明智? 有没有办法让 mongoengine 懒惰地查询数据库(它在我们迭代查询集时请求对象)?

【问题讨论】:

    标签: python mongodb lazy-evaluation mongoengine


    【解决方案1】:

    根据docs(根据我的经验),collection.objects 返回一个懒惰的QuerySet。您的第一个问题可能是您正在调用 objects 属性,而不仅仅是将其用作可迭代对象。我觉得您的应用程序使用这么多内存一定有其他原因,也许process(object) 以某种方式存储了对它的引用?尝试以下代码并检查您的应用的内存使用情况:

    queryset = custom_documents.objects
    print queryset.count()
    

    由于QuerySets 是惰性的,您也可以执行custom_documents.limit(100).skip(500) 之类的操作,以便仅返回对象 500-600。

    【讨论】:

    • 你是对的,问题出在我的过程函数中,它在某处存储了引用。谢谢你的回答:)
    【解决方案2】:

    我想你想看看查询集 - 这些是 MongoEngine 游标的包装器:

    http://mongoengine.org/docs/v0.4/apireference.html#querying

    它们让您可以控制返回的对象数量,主要是处理批量大小设置等,您可以直接在 pymongo 驱动程序中设置:

    http://api.mongodb.org/python/current/api/pymongo/cursor.html

    默认情况下,游标通常被设置为这种行为,您必须尝试让它们一次性返回所有内容,即使在本机 mongodb shell 中也是如此。

    【讨论】:

      猜你喜欢
      • 2019-04-19
      • 2011-08-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-08-02
      • 2010-11-30
      • 2019-03-29
      • 1970-01-01
      相关资源
      最近更新 更多