Фоновая задача сельдерея 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()

Где origin — это CSV-файл. Когда файл большой (более 50 000 строк), задача занимает всю память, выдавая ошибки R14, пока не будет отменена системой (при 150% доступной памяти 512 МБ). Память никогда не освобождается, и нам приходится перезапускать задачу вручную.

Работая на машине с Linux или с мастерами на машине для разработки, он завершается без проблем (все 170 000 строк). Кажется, утечка памяти ТОЛЬКО на Heroku. Кстати, мы запускаем с DEBUG=False.

Что-то не так с реализацией задач сельдерея в Heroku? Что-нибудь, что мы можем пропустить? Это стало препятствием при развертывании на Heroku.

Любая помощь будет высоко ценится.


person gapfranco    schedule 28.03.2013    source источник
comment
Просто общее предложение по отладке: я предполагаю, что это не связано ни с Django, ни с Celery. Чтобы доказать это, я бы создал минимальное приложение Heroku (без Django, просто main), которое делает это, и попытался бы запустить его. Если это не удается, сначала просмотрите файл requirements.txt, а затем добавьте отладочные отпечатки. Если это удастся, начните постепенно добавлять остальные вещи, пока не разберетесь. Удачи!   -  person Nitzan Shaked    schedule 18.05.2013
comment
Вы уверены, что он не использует большие объемы памяти локально, и вы просто не заметили?   -  person JoshB    schedule 21.06.2013


Ответы (2)


Я согласен с JoshB, что в вашем случае требуется более 512 МБ памяти.

  • Что, если вы сделаете задачу process_line и создадите очередь из них вместо задачи для обработки всего файла. В этом случае ваша память на Heroku не будет перегружена.

  • Другим возможным решением для вас может быть новый сервис от Heroku, где вы можете использовать 1 ГБ ОЗУ на своих динамометрах. Ссылка: 2x dynos beta

person shalakhin    schedule 12.07.2013

Утечка памяти Django, когда для DEBUG установлено значение True< /a>, потому что он сохраняет копию каждого выполненного оператора SQL.

Вы можете протестировать локально, используя виртуальную машину с теми же характеристиками, что и ваш хостинг. Или используйте ulimit, чтобы ограничить память процесса. Таким образом, вы можете проверить, работает ли ваш код локально только с 512 МБ ОЗУ.

person alej0    schedule 30.08.2013