LINUX.ORG.RU

Случаи использования gc.collect()

 ,


0

1

Поделитесь случаями из практики.

Часто ли вам приходится вызывать gc.collect() после del my_object?

Каким инструментарием обычно отслеживаете утечки памяти в python-коде?



Последнее исправление: i_am_not_ai (всего исправлений: 1)

Часто ли вам приходится вызывать gc.collect() после del my_object

ни разу

утечки памяти в python-коде?

Ни gc.collect(), ни del не помогут тебе найти или устранить утечки. Отследить их наличие несложно, достаточно смотреть в top или ps, а вот найти причину довольно сложно. На моей практике, причина всегда находилась аналитически. Ну тип отключешь тот или иной кусок программы, смотришь не пропала ли утчечка. На моей практике причинами всегда были циклические ссылки или дырявые внешние либы. Со вторым редко можно сделать что-то самостоятельно, а вот первое решается использованием weakref

Aswed ★★★★★
()
Ответ на: комментарий от Zhbert

Там разве вообще об этом думают? Это ж не си, чтобы о памяти думать — пишешь абы как и все.

Таки думают. Открыл картинку в pillow, не закрыл - минус дофига памяти. Сделал read() не указав сколько собственно читать - высосал в память пару гиг и ООМнулся. Настругал «умных» кешей и они подрались с такими же «умными» из соседнего модуля - опять ООМ.

Не, это не сишка конечно, но память мониторить очень даже нужно, если конечно ты не одноразовый скрипт пишешь. И ввиду крайне ограниченного контроля над этой самой памятью силами питона, иногда особо жручую хрень проще вынести в cython и вручную чистить память как в сишке.

upcFrost ★★★★★
()
Ответ на: комментарий от upcFrost

И ввиду крайне ограниченного контроля над этой самой памятью силами питона, иногда особо жручую хрень проще вынести в cython и вручную чистить память как в сишке.

Вот я примерно об этом и говорил, что там нет нормальных средств для этого, и если ты захочешь сделать что-то серьезное — привет костыли сразу.

Zhbert ★★★★★
()

Часто ли вам приходится вызывать gc.collect() после del my_object?

Только при экспериментах или отладке утечек памяти. В нормальном коде - нет.

Может понадобиться в PyPy, т.к. в нём сборщик мусора не использует подсчёт ссылок, соотв-но, поведение сильно отличается (не работают предположения нерадивых разработчиков, типа open('somefile', 'w').write(some_text), что файловый объект будет сразу же собран сборщиком мусора после записи).

Но я не знаю ни одного проекта, использующего PyPy (все ссут его использовать, либо не получается завести какую-нибудь зависимость, и на этом этапе бросают).

Каким инструментарием обычно отслеживаете утечки памяти в python-коде?

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

Самую сложную утечку памяти в своей жизни, которая случалась только в проде, который нельзя останавливать, и на известном высоконагруженном сервисе, которым пользуются десятки миллионов пользователей, смог найти только при помощи meliae (которую ещё и пришлось пропатчивать для этого).

emorozov
()
Ответ на: комментарий от Zhbert

Ну, слушай, делать что-то «серьёзное» в плане нагрузки проц-память на чистом питоне ты все равно не будешь, он всё-таки однопоточный и не очень бодрый. На нём скорее всего будет обвязка для этого «серьёзного», скажем веб-сервер или работа с базой. И для таких вещей контроля памяти там в целом хватает.

Проблема скорее что этот самый контроль можно игнорить. Например какого пня тот же read можно вызвать без аргумента? Такие вещи для обвязки как раз критичны, и ими вполне можно управлять. А то что нельзя «выделить ровно 100508 байт» на структуру и потом их аккуратно почистить по выходу из функции - слабо себе представляю питонячий проект где это нужно и где это не вынесено в сишку

upcFrost ★★★★★
()

Каким инструментарием обычно отслеживаете утечки памяти в python-коде?

Memray плюс интеграция/e2e/юниты на худой конец. Очень удобно

upcFrost ★★★★★
()

gc.collect это не про устранение утечек. Как он поможет, если на объекты остались забытые ссылки?

Эта команда нужна, когда ты занимался memory intensive работой и хочешь побыстрее отдать память ОС, а не ждать у моря погоды. То есть ты знаешь, что в куче сейчас должно быть много мёртвых объектов и они и сами собой освободились бы, но хочешь почему-то форсировать процесс.

Нет, не пользовался на практике.

KivApple ★★★★★
()
Ответ на: комментарий от DumLemming

ALGOL и FORTRAN мне не понравились, когда читал первые книги по программированию. Какой-то слишком академический синтаксис. Нет того драйва, который был в Турбо Паскале или ассемблере. А на ZX у меня не было трансляторов FORTRAN на кассетах.

Была возможность писать программы на FORTRAN в НИИ, но отпугнули тонны легаси.

Да и какой у нас в СНГ был выбор? Импортозамещение началось ещё с 1970х.

i_am_not_ai
() автор топика
Ответ на: комментарий от umren

если не хватит то просто x2 на машине сделаю

Это хорошо, когда деньги - твои, и машина - локально.

А если коммерческий бэкенд 24x7 на VPS, там ещё и заказчику придётся объяснять, зачем увеличиваешь объём RAM.

i_am_not_ai
() автор топика
Ответ на: комментарий от snizovtsev
___________attribute______________((((((((((((((((((__________cleanup____________))))))))))))))

Это во-первых. А во-вторых, беглое гугленье показало, что этот атрибут надо вешать на переменную, но нельзя повесить на структуру. Т.е. аннотировать надо каждый экземпляр. (Читай – задавать деструктор для класса не в самом классе, а при каждом его инстанциировании. Где-то забудешь, где-то вообще другой впишешь. Такого идиотизма нарочно не придумаешь. «Happy debugging suckers.» (c))

Также нагуглилось будто есть либа, которая с помощью этого атрибута эмулирует плюсовые std::unique_ptr и std::shared_ptr. Как только не извращаются, лишь бы на плюсах не писать.

pr849
()
Последнее исправление: pr849 (всего исправлений: 2)
Ответ на: комментарий от pr849

Как только не извращаются, лишь бы на плюсах не писать.

А могли бы просто обратную совместимость поддерживать при написании Си++. И не надо было бы два компилятора.

i_am_not_ai
() автор топика
Ответ на: комментарий от pr849

Обратная совместимость – зло. Обратная совместимость с кошмарно-убогим полу-недо-типизированным языком – зло в квадрате.

Я один тут свои «поделки» под valgrind гоняю?

bugfixer ★★★★★
()
Ответ на: комментарий от bugfixer

Я один тут свои «поделки» под valgrind гоняю?

Нет. Я тоже пробовал запускать свои поделки под valgrind. Впечатление - «кошмар», начинается с загрузки стандартных модулей из дистрибутивного репозитория.

i_am_not_ai
() автор топика