这是否可以用mongoengine(python)懒洋洋地查询数据库?

问题描述:

我有一个内存问题mongoengine(在Python中)。这是否可以用mongoengine(python)懒洋洋地查询数据库?

比方说,我有一个非常大量的custom_documents(几千)。 我要处理它们,就像这样:

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

的问题是custom_documents.objects()装载在内存中的对象和我的应用程序使用几个GB ...

我该怎么做才能让更多的内存明智? 有没有办法让mongoengine懒洋洋地查询数据库(当我们在queryset上迭代时它会请求对象)?

根据docs(以我的经验),collection.objects返回一个懒惰的QuerySet。你的第一个问题可能是你调用了objects属性,而不是仅仅将它用作迭代器。我觉得你的应用程序需要使用如此多的内存,可能process(object)会以某种方式存储对它的引用吗?试试下面的代码并检查应用程序的内存使用情况:

queryset = custom_documents.objects 
print queryset.count() 

由于QuerySets是懒惰的,你可以以仅返回对象500-600做这样的事情custom_documents.limit(100).skip(500)为好。

+0

你说得对,问题出在我的过程函数中,它在某处存储引用。谢谢你回答:) – Oos 2012-03-23 15:29:22

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

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

他们让你控制对象的数量恢复,基本上采取的批量大小设置等护理您可以在pymongo司机直接设置:

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

光标被设置为一般行为这种方式默认情况下,你必须设法让他们沤甚至在本地的mongodb外壳中都能一炮打响。