Можно ли лениво запрашивать базу данных с помощью mongoengine (python)? - PullRequest
4 голосов
/ 23 марта 2012

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

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

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

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

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

Ответы [ 2 ]

6 голосов
/ 23 марта 2012

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

queryset = custom_documents.objects
print queryset.count()

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

1 голос
/ 23 марта 2012

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

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

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

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

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

...