2013-03-28 123 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。