Когда я запускаю запрос на большом множестве небольших объектов (объекты 15k с несколькими короткими строковыми и логическими свойствами), не делая ничего с этими объектами, я постоянно вижу использование памяти экземпляра (увеличение на 70 Мб). Увеличение памяти не выглядит пропорциональным количеству данных, которые ему когда-либо нужно хранить в памяти только для запроса.Ошибка использования памяти приложения App Engine DB
Петля я использую следующее:
cursor = None
while True:
query = MyModel.all()
if cursor:
query.with_cursor(cursor)
fetched = 0
for result in query.run(batch_size = 500):
fetched += 1
# Do something with 'result' here. Actually leaving it empty for
# testing to be sure I don't retain anything myself
if fetched == 500:
cursor = query.cursor()
break
else:
break
Чтобы быть уверенным, что это не из-за Appstats, я называю appstats.recording.dont_record()
не записывать какие-либо статистику.
Кто-нибудь знает, что может быть? Или любые указатели на то, как отлаживать/профилировать это?
Update 1: Я включил gc.set_debug(gc.DEBUG_STATS)
на производстве код, и я вижу, что сборщик мусора вызывается регулярно, так что это пытается собрать мусор. Когда я вызываю gc.collect()
в конце цикла (также конец запроса); он возвращает 0
, и не помогает.
Update 2: Я сделал некоторые взлома, чтобы получить гуппи работать на dev_appserver, и это, казалось, указывают, что после явного gc.collect()
в конце цикла, большая часть памяти была поглощена в «Словаре из google.appengine.datastore.entity_pb.Property.
у вас возникла проблема с командой GAE? Если да, то можете ли вы опубликовать ссылку? Вчера я спросил необычно похожий вопрос о SO: http://stackoverflow.com/questions/32877705/how-is-memory-garbage-collected-in-app-engine-python-when-iterating-over-db-re/ 32883298 # 32883298 – tom
Я нашел его: https://code.google.com/p/googleappengine/issues/detail?id=12243 – tom