大内存Python后台作业

Wil*_*nes 5 python heroku mongodb flask python-rq

我正在运行Flask服务器,它将数据加载到MongoDB数据库中.由于存在大量数据,这需要很长时间,我想通过后台工作来完成这项工作.

我使用Redis作为消息代理和Python-rq来实现作业队列.所有代码都在Heroku上运行.

据我所知,python-rq使用pickle来序列化要执行的函数,包括参数,并将其与其他值一起添加到Redis哈希值.

由于参数包含要保存到数据库的信息,因此它非常大(约50MB),当它被序列化并保存到Redis时,不仅耗费了大量时间,而且还消耗了大量内存.Heris的Heroku计划仅售100美元,售价30美元.事实上我经常会遇到OOM错误:

OOM command not allowed when used memory > 'maxmemory'.

我有两个问题:

  1. python-rq是否适合这项任务,或者Celery的JSON序列化更合适?
  2. 有没有办法不序列化参数,而是引用它?

您对最佳解决方案的想法非常感谢!

rde*_*ges 7

由于您在评论中提到您的任务输入是一大堆键值对,我将推荐以下内容:

  • 在文件中加载您的键/值对列表。
  • 将文件上传到 Amazon S3。
  • 获取生成的文件 URL,并将其传递到您的 RQ 任务中。
  • 在您的工作任务中,下载该文件。
  • 逐行解析文件,将文档插入 Mongo。

使用上述方法,您将能够:

  • 快速将您的任务分解为可管理的块。
  • 将这些小的压缩文件快速上传到 S3(使用 gzip)。
  • 通过需要更少的数据通过线路来大大减少您的 redis 使用。
  • 将 S3 配置为在一定时间后自动删除您的文件(为此有 S3 设置:例如,您可以让它在 1 天后自动删除)。
  • 通过一次处理一个文件,大大减少您的工作人员的内存消耗。

对于像您正在做的事情这样的用例,这比通过您的排队系统发送这些项目要快得多,并且需要的开销也少得多。

希望这可以帮助!