Возможно ли лениво запрашивать базу данных с помощью mongoengine (python)?

У меня проблема с памятью с mongoengine (в python).

Допустим, у меня очень большое количество custom_documents (несколько тысяч). Я хочу обработать их все, например:

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

Проблема в том, что custom_documents.objects() загружает все объекты в память, а мое приложение использует несколько ГБ...

Как я могу сделать, чтобы сделать его более разумным? Есть ли способ заставить mongoengine лениво запрашивать БД (он запрашивает объекты, когда мы повторяем набор запросов)?


person Tewfik    schedule 23.03.2012    source источник


Ответы (2)


Согласно документам (и по моему опыту), collection.objects возвращает ленивый QuerySet. Ваша первая проблема может заключаться в том, что вы вызываете атрибут objects, а не просто используете его как итерируемый объект. Я чувствую, что должна быть какая-то другая причина, по которой ваше приложение использует так много памяти, возможно, process(object) каким-то образом хранит ссылку на него? Попробуйте следующий код и проверьте использование памяти вашим приложением:

queryset = custom_documents.objects
print queryset.count()

Поскольку QuerySets ленивы, вы можете делать такие вещи, как custom_documents.limit(100).skip(500), чтобы возвращать только объекты 500-600.

person jjm    schedule 23.03.2012
comment
вы были правы, проблема была в моей функции процесса, которая где-то хранила ссылку. Спасибо за ответ :) - person Tewfik; 23.03.2012

Я думаю, вы хотите взглянуть на наборы запросов — это оболочка MongoEngine для курсоров:

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

Они позволяют вам контролировать количество возвращаемых объектов, в основном заботясь о настройках размера пакета и т. д., которые вы можете установить непосредственно в драйвере pymongo:

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

Курсоры настроены на такое поведение по умолчанию, вам нужно попытаться заставить их возвращать все одним выстрелом, даже в родной оболочке mongodb.

person Adam Comerford    schedule 23.03.2012