1

Я работаю над простым приложением, которое принимает изображения, оптимизирует их и сохраняет в облачном хранилище. Я нашел пример, который берет файл и использует PIL для его оптимизации. Код выглядит следующим образом:GAE - Загрузите оптимизированное изображение в облачное хранилище

def inPlaceOptimizeImage(photo_blob): 
     blob_key = photo_blob.key() 
     new_blob_key = None 

     img = Image.open(photo_blob.open()) 
     output = StringIO.StringIO() 
     img.save(output,img.format, optimized=True,quality=90) 
     opt_img = output.getvalue() 
     output.close() 

     # Create the file 
     file_name = files.blobstore.create(mime_type=photo_blob.content_type) 

     # Open the file and write to it 
     with files.open(file_name, 'a') as f: 
      f.write(opt_img) 

     # Finalize the file. Do this before attempting to read it. 
     files.finalize(file_name) 

     # Get the file's blob key 
     return files.blobstore.get_blob_key(file_name) 

Это прекрасно работает на местном уровне (хотя я не знаю, насколько хорошо она оптимизируется, потому что, когда я бег загруженного изображения через что-то вроде http://www.jpegmini.com/ он получает снижается 2.4x до сих пор). Однако, когда я развернуть приложение и попытайтесь загрузить изображения, которые я часто получаю 500 ошибок и эти сообщения в журналах:

F 00:30:33.322 Exceeded soft private memory limit of 128 MB with 156 MB after servicing 7 requests total 
W 00:30:33.322 While handling this request, the process that handled this request was found to be using too much memory and was terminated. This is likely to cause a new process to be used for the next request to your application. If you see this message frequently, you may have a memory leak in your application. 

У меня есть два вопроса:

  1. Это даже лучший способ оптимизировать и сохранить изображения в облачном хранилище?
  2. Как предотвратить появление этих 500 ошибок?

Заранее спасибо.

ответ

1

Ошибка, с которой вы столкнулись, происходит из-за ограничений памяти вашего класса Instance.

Что я предлагаю вам сделать, это отредактировать ваш .yaml-файл, чтобы настроить ваш модуль и указать свой класс экземпляра как F2 или выше. Если вы не используете модули, вы также должны добавить «module: default» в начале вашего файла app.yaml, чтобы GAE знал, что это ваш модуль по умолчанию.

Вы можете посмотреть на это article из документов, чтобы просмотреть доступные классы экземпляров и способ их легко настроить.

Еще одним обходным решением было бы ограничить размер изображения при его загрузке, но в конечном итоге вы получите аналогичную проблему.

Что касается предыдущего вопроса и способа оптимизации ваших изображений, вы можете взглянуть на App Engine Images API, который обеспечивает возможность управления данными изображения с помощью специализированной службы изображений. В вашем случае вам может понравиться преобразование «Я чувствую себя счастливым». Используя этот API, вам может не понадобиться обновлять свой класс экземпляров.

+0

Спасибо! Сейчас я работаю над тем, чтобы разбить приложение на модули, и я проверю это. – 2748

 Смежные вопросы

  • Нет связанных вопросов^_^