所以我尝试上传一个celery 的文件,在我的heroku网站上使用redis。我正在上传一个 .exe
键入文件,大小为 20MB
. heroku在they're hobby:dev一节中说,可以上传的最大内存是 25MB
. 但是我,正在尝试用celery 上传一个文件(将它从字节转换成base64,解码并发送给函数)却得到了 kombu.exceptions.OperationalError: OOM command not allowed when used memory > 'maxmemory'.
错误。请记住,当我试图上传例如 5MB
锉刀很好用。但是 20MB
不。我将python与flask框架结合使用
1条答案
按热度按时间aiazj4mn1#
在数据库中存储文件有两种方法(redis只是内存中的数据库)。您可以将blob存储在db中(对于小文件,比如说几个kbs),也可以将文件存储在内存中,并将指向该文件的指针存储在db中。
因此,对于您的情况,将文件存储在磁盘上,并且只将文件指针放在db中。
这里需要注意的是,heroku有一个临时文件系统,每24小时或在您部署新版本的应用程序时被删除一次。
所以你必须这样做:
编写一个小函数将文件存储在本地磁盘上(这是临时存储),并返回文件的路径
用文件路径向celery 添加任务,即celery 任务的参数将是“文件路径”,而不是20mb数据的序列化blob。
celery worker进程在您刚刚排队的任务空闲时选择它并执行它。
如果您以后需要访问该文件,并且由于本地heroku磁盘只有临时的,那么您必须将该文件放在一些永久性存储中,比如awss3。
(我们经历了所有这些困难,没有将文件直接放在s3中的原因是,对本地磁盘的访问速度很快,而s3磁盘可能位于其他位置的某个服务器场中,在那里保存文件需要时间。如果您尝试在主进程中将文件写入s3,那么您的web进程可能会显得很慢/卡住。)