2013-09-29 3 views
1

У меня есть несколько рабочих, которые слушают очередь RabbitMQ, и это делает интенсивную работу с дисковым вводом-выводом - открывая файлы размером ~ 18 МБ, делая некоторые синтаксические разборки и записывая в некоторые файлы. При обработке одной работы рабочий может занять до 200 МБ памяти .. и это нормально.Утечка памяти в голодных рабочих Python

Однако проблема заключается в том, что рабочий продолжает оставаться бездействующим и все еще резервирует этот объем памяти. Я слепо попытался сделать некоторую сборку мусора вручную с помощью gc.collect() после выполнения задания, но без каких-либо результатов.

Мой рабочий класс, который получает задание выглядит следующим образом:

class BuildWorker(worker.Worker): 

    def callback(self, ch, method, properties, body): 
     fp = FileParseAndStuff() 
     fp.execute_job(ch, method, properties, body) 
     fp = None 

Не следует все, что происходит внутри FP здесь содержаться память мудрыми и быть удалены, как только я установить, что объект None? Я также пытался использовать инструкцию Delta для Python, но без каких-либо улучшений.

Я использую Python 2.7 и python-pika для связи с сервером RabbitMQ, если это имеет значение.

+0

Вы можете попытаться выяснить, какие объекты занимают это пространство, используя [objgraph] (http://mg.pov.lt/objgraph/). – fjarri

+0

Смотрите это http://stackoverflow.com/questions/11957539/python-memory-not-being-given-back-to-kernel –

ответ

0

поставить флаг перед fp = None, например, записать в файл «done» или распечатать на консоль. Ваш рабочий может быть еще не там, когда вы вызываете del или gc.collect(). Если это так, проверьте свой метод execute_job.

+0

Я не понимаю, я не использую асинхронную фреймворк для Python .. поэтому fp.execute_job() завершается до выполнения следующей строки (fp = None). Поэтому я не вижу, как это могло бы помочь. – Niklas9

+0

попытайтесь передать манекену работнику, возможно, ссылка хранится у работника сам и выпустил, когда начал новую работу. – cox

+0

Нет, это не к сожалению, потребление памяти растет с одинаковой суммой для каждой работы :( – Niklas9

Смежные вопросы