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