В своем проекте я периодически использую травление для представления внутреннего состояния процесса для сохраняемости. В ходе обычной работы ссылки на объекты добавляются и удаляются из множества других объектов.
Например, у Person может быть атрибут с именем address_list (список), который содержит объекты Address, представляющие все свойства, которые они пытаются продать. Другой объект, RealEstateAgent, может иметь атрибут с именем address_for_sale (тоже список), который содержит объекты Address того же типа, но только те, которые перечислены в их агентстве.
Если продавец снимает свою собственность с продажи или она продается, адрес удаляется из обоих списков.
И Persons, и RealEstateAgents являются членами списка центральных объектов (Masterlist) для травления. Моя проблема заключается в том, что по мере того, как я добавляю и удаляю свойства, а также периодически солючу объект Masterlist, размер файла соленья увеличивается, даже если я удалил (на самом деле удалил) больше свойств, чем добавил. Я понимаю, что при травлении Masterlist есть циклическая ссылка. В моем приложении много циклических ссылок.
Я изучил файл pickle с помощью pickletools.dis(), и, хотя его трудно читать человеку, я вижу ссылки на адреса, которые были удалены. Я уверен, что они удалены, потому что даже после распаковки их нет в соответствующих списках.
Хотя приложение работает правильно до и после травления/распаковывания, растущий размер файла является проблемой, поскольку процесс должен выполняться долго, и его повторная инициализация невозможна.
Мой пример является условным, и может быть сложно спросить, но мне интересно, есть ли у кого-нибудь опыт решения проблем со сборкой мусора с использованием рассола, когда они содержат циклические ссылки или что-то еще, что может указать мне правильное направление для отладки этого . Может быть, некоторые инструменты, которые будут полезны.
Большое спасибо