大内存Python后台作业

时间:2017-01-04 10:35:37

标签: python mongodb heroku 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. 有没有办法不序列化参数,而是引用它?
  3. 非常感谢您对最佳解决方案的看法!

2 个答案:

答案 0 :(得分:3)

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

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

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

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

对于您正在做的用例,这将比通过排队系统发送这些项目更快,并且所需的开销要小得多。

希望这有帮助!

答案 1 :(得分:0)

事实证明,适用的解决方案是将数据保存到Amazon S3存储,然后将URI传递给后台任务中的函数。