2013-08-17 2 views
0

У меня есть тип хранилища данных Google App Engine, называемый Obj, и он имеет около 500K объектов на производстве. Я пытаюсь запросить только 50 объектов Obj, но несмотря на то, что я устанавливаю предельный аргумент на 50, запрос в конечном итоге вызывает ошибку «Превышение предела ограниченной частной памяти».Google App Engine NDB Запросы и превышение памяти

Будет ли это иметь какое-то отношение к использованию ndb.GenericProperty в запросе? Атрибут «trashed_date», который является типом даты и времени, обычно не является атрибутом Obj. Я также вручную создал правильный индекс для статуса и trashed_date. Должно ли «trashed_date» всегда быть собственностью этой модели?

Ниже приведен код, который я использую, что я могу сделать при запросе всего 50 объектов, которые не превышают ограничение на память?

q = Obj.query(
    Obj.status == 1, 
    ndb.GenericProperty('trashed_date') < expire_date 
) 
results = q.fetch(50) 
+0

Я сомневаюсь, что это имеет какое-либо отношение к общей собственности. Хотя если класс Obj не имеет свойства trashed_date, почему вы запрашиваете его? Насколько велики объекты, которые вы извлекаете. Происходит ли ошибка при каждом запуске запроса или с течением времени? –

+0

Он всегда выдает ошибку. Мысль состоит в том, что очень немногие из объектов Obj когда-либо имеют свойство trashed_date. Каждый объект не должен быть очень большим, не более 1K. – adam

+0

Возможно, вам захочется просмотреть приложение. См. Https://code.google.com/p/apptrace/wiki/UsingApptrace. В стороне вы понимаете, что объекты, у которых нет свойства trashed_date, никогда не будут возвращаться с этим запросом. –

ответ

3

Пожалуйста, попробуйте это с помощью q.iter() и счетчик, чтобы ограничить его до 50. У меня была аналогичная проблема с выборки() и неподвижную его с помощью ITER(). GAE довольно сильно советует не получать. YMMV. НТН. -stevep

+0

У вас есть ссылка на заявление против использования 'fetch'? Я думал, что тоже это прочитал, но ничего не нашел в документах. –

+1

Цитата: «Примечание: вам редко нужно использовать этот метод [fetch], но почти всегда лучше использовать run()». note: db is run(), ndb is iter()] Ссылка: https://developers.google.com/appengine/docs/python/datastore/queryclass – stevep

+0

Ahh, спасибо. Похоже, что это должно упоминаться в документах ndb, если 'iter' имеет те же ограничения. –