Ниже приведена часть кода python, работающего в Google App Engine. Он извлекает файл из Google Cloud Storage с помощью клиента cloudstorage.Утечка памяти при чтении файлов из облачного хранилища Google в Google App Engine (python)
Проблема в том, что каждый раз, когда код считывает большой файл (около 10 М), память, используемая в экземпляре, будет увеличиваться линейно. Вскоре процесс прекращается из-за ограничения «Превышение мягкой частной памяти 128 МБ с 134 МБ после обслуживания всего 40 запросов».
class ReadGSFile(webapp2.RequestHandler):
def get(self):
import cloudstorage as gcs
self.response.headers['Content-Type'] = "file type"
read_path = "path/to/file"
with gcs.open(read_path, 'r') as fp:
buf = fp.read(1000000)
while buf:
self.response.out.write(buf)
buf = fp.read(1000000)
fp.close()
Если я прокомментирую следующую строку, то использование памяти в экземпляре изменится. Так что это должна быть проблема webapp2.
self.response.out.write(buf)
Предполагается, что webapp2 освободит пространство памяти после завершения ответа. Но в моем коде это не так.
Вы можете только один раз написать объект ответа. – user2266449
Исходный поток буферизует весь вывод в памяти, а затем отправляет конечный результат, когда обработчик завершает работу. webapp не поддерживает потоковые данные для клиента. Вам нужен API канала для потоковой передачи. – voscausa
Я попытался написать объект ответа только один раз: "buf = fp.read (20000000); self.response.out.write (buf); fp.close();". Но это не решает проблему –