Heroku - Redis memory> 'maxmemory' с файлом 20 МБ в hobby:dev, где должно быть 25 МБ
Итак, я пытаюсь загрузить файл с Celery, который использует Redis, на моем веб-сайте Heroku. Я пытаюсь загрузить.exe
тип файла размером 20MB
. Heroku в разделе They hobby: dev говорит, что максимальный объем памяти, который может быть загружен, составляет25MB
. Но я, который пытается загрузить файл в Celery(превращая его из байтов в base64, декодируя его и отправляя в функцию), получаюkombu.exceptions.OperationalError: OOM command not allowed when used memory > 'maxmemory'.
ошибка. Имейте в виду, когда я пытаюсь загрузить, например,5MB
файл работает нормально. Но20MB
нет. Я использую Python с фреймворком Flask
1 ответ
Есть два способа хранить файлы в БД (Redis - это просто БД в памяти). Вы можете либо сохранить blob-объект в БД (для небольших файлов, скажем, несколько КБ), либо вы можете сохранить файл в памяти и сохранить указатель на файл в БД.
Поэтому в вашем случае сохраните файл на диске и поместите в БД только указатель файла.
Уловка здесь в том, что у Heroku есть эфемерная файловая система, которая стирается каждые 24 часа или всякий раз, когда вы развертываете новую версию приложения.
Итак, вам придется сделать что-то вроде этого:
- Напишите небольшую функцию для хранения файла на локальном диске (это временное хранилище) и возврата пути к файлу
- Добавьте задачу в Celery с указанием пути к файлу, т.е. параметром задачи Celery будет "путь к файлу", а не сериализованный большой двоичный объект размером 20 МБ.
- Рабочий процесс Celery выбирает задачу, которую вы только что поставили в очередь, когда она освобождается, и выполняет ее.
Если вам понадобится доступ к файлу позже, и поскольку локальный диск heroku имеет только временный характер, вам придется поместить файл в какое-нибудь постоянное хранилище, например AWS S3.
(Причина, по которой мы выполняем все эти действия и не помещаем файл непосредственно в S3, заключается в том, что доступ к локальному диску происходит быстро, в то время как диски S3 могут находиться в какой-то другой серверной ферме в другом месте, и для сохранения файла там требуется время. ваш веб-процесс может показаться медленным / зависшим, если вы попытаетесь записать файл в S3 в своем основном процессе.)