У меня есть несколько рабочих, которые слушают очередь 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, если это имеет значение.
Вы можете попытаться выяснить, какие объекты занимают это пространство, используя [objgraph] (http://mg.pov.lt/objgraph/). – fjarri
Смотрите это http://stackoverflow.com/questions/11957539/python-memory-not-being-given-back-to-kernel –