У нас есть приложение App Engine, которое записывает много файлов относительно большого размера в Google Cloud Store. Эти файлы представляют собой CSV-файлы, которые динамически создаются, поэтому мы используем Python StringIO.StringIO
в качестве буфера и csv.writer
в качестве интерфейса для записи в этот буфер.App Engine Отложенные: отслеживание утечек памяти
В общем, наш процесс выглядит следующим образом:
# imports as needed
# (gcs is the Google Cloud Store client)
buffer = StringIO.StringIO()
writer = csv.writer(buffer)
# ...
# write some rows
# ...
data = file_buffer.getdata()
filename = 'someFilename.csv'
try:
with gcs.open(filename, content_type='text/csv', mode='w') as file_stream:
file_stream.write(data)
file_stream.close()
except Exception, e:
# handle exception
finally:
file_buffer.close()
Как мы понимаем, csv.writer
не нужно закрывать себя. Скорее всего, необходимо закрыть только buffer
и file_stream
.
Бежит вышеописанный процесс в deferred
, вызываемые очередями задач App Engine. В конечном счете, мы получим следующее сообщение об ошибке после нескольких вызовов нашей задачи:
Превышен мягкий частный предел памяти объемом 128 Мб с 142 МБ после обслуживания 11 запросов всего
Очевидно, то существует утечка памяти в нашем приложении. Однако, если приведенный выше код верен (что мы допускаем, может быть, и не так), то наша единственная идея заключается в том, что через обслуживание наших запросов проходит некоторое количество памяти (как указывает сообщение об ошибке).
Таким образом, нам интересно, поддерживаются ли некоторые объекты App Engine во время выполнения deferred
. Следует также отметить, что наши CSV в конечном итоге успешно записаны, несмотря на эти сообщения об ошибках.
' "Очевидно, то, есть утечка памяти"' - не обязательно.Использование базовой памяти приложения (со всем загруженным кодом) может быть выше, чем при запуске. 128M не так много, по умолчанию для бэкэнд-экземпляров в настоящее время B2/256M. Также важны пики параллельных обработанных запросов. Также см. Http://stackoverflow.com/questions/32981118/how-does-app-engine-python-manage-memory-across-requests-exceeded-soft-privat, http://stackoverflow.com/questions/31853703/ google-app-engine-db-query-memory-usage, http://stackoverflow.com/questions/33036334/memory-leak-in-google-ndb-library –
Я думаю, что это могло бы стать ответом! Очень интересно, как экземпляр B2 в Google имеет половину памяти ... – nmagerko
как вы используете отложенные задачи? по одному или кучу много из них? Связаны ли их казни? –