4

我对 mongoengine(在 python 中)有内存问题。

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

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

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

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

4

2 回答 2

7

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

queryset = custom_documents.objects
print queryset.count()

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

于 2012-03-23T15:10:09.190 回答
1

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

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

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

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

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

于 2012-03-23T15:03:06.660 回答