Я написал программу на Python, которую нужно запускать несколько дней из-за постоянного сбора данных. Раньше у меня не было проблем с запуском этой программы в течение нескольких месяцев. Недавно я сделал несколько обновлений для программы, и теперь, примерно через 12 часов, я получаю ужасный убийцу памяти. Вывод dmesg следующий:
[9084334.914808] Out of memory: Kill process 2276 (python2.7) score 698 or sacrifice child
[9084334.914811] Killed process 2276 (python2.7) total-vm:13279000kB, anon-rss:4838164kB, file-rss:8kB
Помимо обычного кода на Python, основным изменением, внесенным в программу, стало добавление многопроцессорной очереди. Это первый раз, когда я использовал эту функцию, поэтому я не уверен, что это может быть причиной проблемы. Назначение Очереди в моей программе — возможность вносить динамические изменения в параллельный процесс. Очередь инициируется в основной программе и постоянно отслеживается в параллельном процессе. Упрощенная версия того, как я делаю это в параллельном процессе, выглядит следующим образом (где «q» — это очередь):
while(1):
if q.empty():
None
else:
fr = q.get()
# Additional code
time.sleep(1)
Динамические изменения 'q' происходят не очень часто, поэтому в большинстве случаев q.empty() будет истинным, но цикл должен быть готов, как только будут сделаны изменения. Мой вопрос в том, будет ли запуск этого кода в течение нескольких часов за один раз привести к тому, что память в конечном итоге закончится? Поскольку цикл while довольно короткий и работает практически без остановок, я подумал, что это может быть проблемой. Если это может быть причиной проблемы, есть ли у кого-нибудь предложения по улучшению кода, чтобы не вызывался убийца нехватки памяти?
Большое тебе спасибо.
if q.empty(): pass
— это идиоматический способ записи этого блока. Но было бы еще лучше просто иметьif not q.empty(): fr = q.get()
в первую очередь. - person Henry Keiter   schedule 27.02.2014.get()
удаляет элемент из очереди или только проверяет его? В последнем случае размер очереди монотонно увеличивается. - person Stefano Sanfilippo   schedule 27.02.2014free
? - person SingleNegationElimination   schedule 27.02.2014