Комментарии 12
Более того, ничего не рассказано о том, как искать утечки памяти, кроме общих слов.
Два раза в жизни я сталкивался с утечками памяти в приложениях на Python. Первый раз это был развесистый сайт на Django. Объем кода очень большой. Недельные поиски не увенчались успехом, было перепробовано все. Проблема была «решена» добавлением параметра, который рестартит воркеры после нескольких сотен запросов.
Второй раз это был не очень большой демон на Python. Потребление памяти росло очень быстро. Практически переписал его два раза, проверил каждую строчку, что нигде не создается циклических ссылок. Использовал все существующие инструменты для поиска утечек памяти. Так и не смог найти.
Так что толковая статья на эту тему не помешала бы. В теории оно все просто. На практике, приходится смотреть в дамп памяти, в котором находятся миллионы примитивных объектов, типа tuple, str, и понять, какие из них должны были быть освобождены, и откуда они вообще взялись, бывает очень сложно.
В обоих случаях подозрение падало на расширения на C. Но данные расширения используются многими проектами, и, насколько я понимаю, ни один из инструментов для поиска утечек в Python, не помогает, если память течет в расширении на C.
Тоже искал утечки, и читал эту статью. На практике все намного сложнее.
Я нашёл забавный способ — форкать и производить действия в дочеренем процессе.
(минутка машинного обучения) У меня утекала память где-то в keras, причём не обычная, а та что на GPU. Скрипт одну за другой обучал много различных сеточек, и в какой-то момент всё падало из-за нехватки свободной памяти на видеокарте. Рабочим решением оказалось форкать процесс, обучать сеточку и сохранять результаты в дочернем, а в родительском ждать совершения дочернего и снова так делать для каждой следующей сетки. У меня были некоторые сомнения относительно того, как это будет сочетаться с использованием cuda (keras импортировалась раньше, чем я форкал процесс, и tensorflow сразу занимала почти всю память на GPU), но это всё нормально работало.
Ищем утечки памяти в приложениях на Python