Использование памяти для запросов к БД Google App Engine
Когда я выполняю запрос к большому набору небольших объектов (15 тыс. Объектов с несколькими короткими строковыми и логическими свойствами), ничего не делая с этими объектами, я вижу, как постоянно увеличивается использование памяти моего экземпляра (увеличение на 70 МБ). Увеличение памяти не выглядит пропорционально количеству данных, которые ему когда-либо нужно хранить в памяти только для запроса.
Цикл, который я использую, следующий:
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()
не записывать какую-либо статистику.
Кто-нибудь знает, что может происходить? Или какие-либо указатели о том, как отладить / профиль этого?
Обновление 1: Я включилgc.set_debug(gc.DEBUG_STATS)
на производственном коде, и я вижу, что сборщик мусора вызывается регулярно, поэтому онявляется пытаюсь собрать мусор. Когда я звонюgc.collect()
в конце цикла (также в конце запроса); это возвращается0
и не помогает.
Обновление 2Я сделал несколько взломов, чтобы заставить гуппи работать на dev_appserver, и это, казалось, указывало, что после явногоgc.collect()
в конце цикла большая часть памяти была занята «диктом google.appengine.datastore.entity_pb.Property».