2013-03-28 124 views
6

我们有一个简单的任务,在Heroku上运行django-celery。喜欢的东西:Heroku芹菜背景任务

@task 
Simple_task(): 
    for line in csv.reader(origin): 
     process_line(line) 

process_line(line): 
    fields = parse_line(line) 
    reg = Model1() # Django model 
    reg.field1 = fields[0] 
    reg.field2 = fields[1] 
    reg.field3 = fields[2] 
    reg.save() 

起源是一个CSV文件。当文件很大时(超过50,000行),该任务占用所有内存,给出R14错误,直到被系统取消(在512 MB的可用内存的150%)。内存永远不会被释放,我们必须手动重启任务。

在Linux机器上运行或者在开发机器上运行,它完成时没有问题(全部为170.000行)。它似乎只在Heroku上泄漏内存。顺便说一句,我们用DEBUG = False运行。

用Heroku实现芹菜任务会破碎吗?我们可能会遗漏什么?这已成为在Heroku上部署的一个显示屏。

任何帮助将不胜感激。

+0

只是一个普遍的调试建议:我的猜测是这与Django和Celery都没有关系。为了证明这一点,我将创建一个最小化的Heroku应用程序(不包括Django,只是一个简单的“主”),然后尝试运行它。如果失败,请首先查看您的requirements.txt并稍后添加调试打印。如果成功,开始逐渐添加剩下的东西,直到找出结果。祝你好运! –

+1

你确定它没有在本地使用大量的内存,你只是没有注意到? – JoshB

回答

0

我同意JoshB,你的情况似乎需要超过512MB的内存。

  • 如果您使任务process_line并创建队列而不是任务来处理整个文件,该怎么办。在这种情况下,Heroku上的内存不会超载。

  • 另一种可能的解决方案可能是Heroku的新服务,您可以在您的dynos上使用1GB RAM。 链接:2x dynos beta

0

Django的内存泄漏时DEBUG is set to True因为它节省了已经执行的SQL语句的副本。

您可以使用与您的主机具有相同规格的虚拟机在本地进行测试。或使用ulimit来限制进程内存。通过这种方式,您可以在本地检查代码是否仅适用于512MB的RAM。