Удаленные объекты все еще упоминаются в рассоле
В моем проекте я периодически использую травление для представления внутреннего состояния процесса на постоянство. Как часть нормальной работы, ссылки на объекты добавляются и удаляются из нескольких других объектов.
Например, Person может иметь атрибут с именем address_list (список), который содержит объекты Address, представляющие все свойства, которые они пытаются продать. Другой объект, RealEstateAgent, может иметь атрибут с именем address_for_sale (также список), который содержит объекты Address того же типа, но только те, которые перечислены в их агентстве.
Если продавец забирает свою собственность с рынка или продает ее, адрес удаляется из обоих списков.
Оба Persons и RealEstateAgents являются членами списка центральных объектов (Masterlist) для травления. Моя проблема заключается в том, что, когда я добавляю и удаляю свойства и повторно использую объект Masterlist с течением времени, размер файла pickle увеличивается, даже когда я удалил (на самом деле) больше свойств, чем добавил. Я понимаю, что в травлении Masterlist есть круговая ссылка. В моем приложении много циклических ссылок.
Я исследовал файл pickle с помощью pickletools.dis(), и хотя его трудно прочитать, я вижу ссылки на удаленные адреса. Я уверен, что они удалены, потому что, даже после удаления, они не существуют в их соответствующих списках.
Несмотря на то, что приложение функционирует правильно до и после извлечения / извлечения, растущий размер файла является проблемой, поскольку процесс должен быть долгим, и повторная инициализация его не является вариантом.
Мой пример условен, и, возможно, это будет слишком сложно, но мне интересно, есть ли у кого-нибудь проблемы с сборкой мусора с использованием солений, когда они содержат циклические ссылки, или что-то еще, что может указать мне правильное направление для отладки этого, Может быть, некоторые инструменты, которые будут полезны.
Большое спасибо
1 ответ
Вы можете попробовать objgraph
... он может серьезно помочь вам в отслеживании утечек памяти и циклических ссылок и отношений указателя между объектами.
Я использую его при отладке солений (в моей собственной упаковке dill
).
Кроме того, некоторые засоленные объекты (по цепочке рассола) будут расслаивать глобалы и часто являются причиной циклических ссылок внутри засоленных объектов.
У меня также есть набор инструментов отладки рассола в dill
, Увидеть dill.detect
на https://github.com/uqfoundation, где есть несколько методов, которые можно использовать для диагностики объектов, которые вы привязываете к засолке. Например, если вы установите dill.detect.trace(True)
, он распечатает все внутренние вызовы для выбора объектов, пока ваш объект сбрасывается.