2013-03-28 7 views
6

Herokuでdjango-celeryを実行するという単純なタスクがあります。ような何か:起源は、csvファイルをある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() 

。ファイルが大きい場合(50.000行以上)、タスクはすべてのメモリーを占有し、システムによって取り消されるまでR14エラーを出します(512MBの使用可能メモリーの150%)。メモリは決して解放されず、手動でタスクを再起動する必要があります。

Linuxマシンで、または開発マシンで営業している人は、問題なく完了します(すべて170.000行)。それはHeroku上にのみメモリをリークしているようだ。 ところで、DEBUG = Falseで実行します。

Herokuのセロリタスクの実装で何かが壊れていますか?私たちは行方不明になることは何ですか?これはHerokuで展開する上でのショーストッパーになっています。

ご協力いただければ幸いです。

+0

ちょうど一般的なデバッグの提案:私の推測は、これはDjangoとCeleryのどちらにも関係ないということです。それを証明するために、私はこれを行う最小限のHerokuアプリ(Djangoなし、普通の "メイン")を作成し、それを実行しようとします。失敗した場合は、まずrequirements.txtを見て、後でデバッグプリントを追加してください。それが成功すれば、あなたがそれを理解するまで徐々に残りのものを追加してください。がんばろう! –

+1

大量のメモリをローカルに使用しておらず、気づいていないことは確かですか? – JoshB

答えて

0

私はJoshBに、あなたのケースでは512MB以上のメモリを使用しているようだと同意します。タスクprocess_lineを作成し、ファイル全体を処理するために、それらのキューの代わりにタスクを作成する場合、どのよう

  • 。その場合、Herokuのあなたの記憶は過負荷にならないでしょう。

  • その他の可能な解決策は、あなたのダイノスに1GBのRAMを使用できるHerokuの新しいサービスです。 リンク:ときDEBUG is set to Trueそれが実行されたすべてのSQL文のコピーを保存しますので、2x dynos beta

0

Djangoのメモリリークが発生。

ホスティングと同じ仕様の仮想マシンを使用してローカルでテストすることができます。または、ulimitを使用してプロセスメモリを制限してください。この方法で、ローカルでコードが512MBのRAMだけで動作するかどうかを確認できます。

関連する問題