1

所以我试图在我的 Heroku 网站上上传一个使用 Redis 的 Celery 文件。我正在尝试上传.exe大小为20MB. Heroku 在他们的爱好:开发部分中说可以上传的最大内存是25MB. 但是我试图在 Celery 中上传文件(将其从字节转换为 base64,对其进行解码并将其发送到函数)kombu.exceptions.OperationalError: OOM command not allowed when used memory > 'maxmemory'.出现错误。请记住,当我尝试上传5MB文件时,它可以正常工作。但20MB没有。我正在将 Python 与 Flask 框架一起使用

4

1 回答 1

1

有两种方法可以在 DB 中存储文件(Redis 只是一个内存 DB)。您可以在数据库中存储一个 blob(对于小文件,例如几 KB),或者您可以将文件存储在内存中并将指向该文件的指针存储在数据库中。

在此处输入图像描述

因此,对于您的情况,将文件存储在磁盘上并仅将文件指针放在数据库中。

这里的问题是 Heroku 有一个临时文件系统,它每 24 小时或每当您部署新版本的应用程序时都会被擦除。

所以你必须做这样的事情:

  1. 编写一个小函数,将文件存储在本地磁盘上(这是临时存储),并返回文件的路径
  2. 使用文件路径向 Celery 添加任务,即 Celery 任务的参数将是“文件路径”,而不是 20MB 数据的序列化 blob。
  3. Celery 工作进程在空闲时选择您刚刚排队的任务并执行它。

如果您稍后需要访问该文件,并且由于本地 heroku 磁盘只有临时磁盘,您必须将文件放在一些永久存储中,例如 AWS S3。

(我们通过所有这些环节而不是将文件直接放在 S3 中的原因是因为访问本地磁盘很快,而 S3 磁盘可能位于其他位置的其他服务器场中,并且将文件保存在那里需要时间。并且如果您尝试在主进程中将文件写入 S3,您的 Web 进程可能会显得缓慢/卡住。)

于 2020-05-26T03:25:58.227 回答