Удаленные объекты все еще упоминаются в рассоле

В моем проекте я периодически использую травление для представления внутреннего состояния процесса на постоянство. Как часть нормальной работы, ссылки на объекты добавляются и удаляются из нескольких других объектов.

Например, Person может иметь атрибут с именем address_list (список), который содержит объекты Address, представляющие все свойства, которые они пытаются продать. Другой объект, RealEstateAgent, может иметь атрибут с именем address_for_sale (также список), который содержит объекты Address того же типа, но только те, которые перечислены в их агентстве.

Если продавец забирает свою собственность с рынка или продает ее, адрес удаляется из обоих списков.

Оба Persons и RealEstateAgents являются членами списка центральных объектов (Masterlist) для травления. Моя проблема заключается в том, что, когда я добавляю и удаляю свойства и повторно использую объект Masterlist с течением времени, размер файла pickle увеличивается, даже когда я удалил (на самом деле) больше свойств, чем добавил. Я понимаю, что в травлении Masterlist есть круговая ссылка. В моем приложении много циклических ссылок.

Я исследовал файл pickle с помощью pickletools.dis(), и хотя его трудно прочитать, я вижу ссылки на удаленные адреса. Я уверен, что они удалены, потому что, даже после удаления, они не существуют в их соответствующих списках.

Несмотря на то, что приложение функционирует правильно до и после извлечения / извлечения, растущий размер файла является проблемой, поскольку процесс должен быть долгим, и повторная инициализация его не является вариантом.

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

Большое спасибо

1 ответ

Решение

Вы можете попробовать objgraph... он может серьезно помочь вам в отслеживании утечек памяти и циклических ссылок и отношений указателя между объектами.

http://mg.pov.lt/objgraph/

Я использую его при отладке солений (в моей собственной упаковке dill).

Кроме того, некоторые засоленные объекты (по цепочке рассола) будут расслаивать глобалы и часто являются причиной циклических ссылок внутри засоленных объектов.

У меня также есть набор инструментов отладки рассола в dill, Увидеть dill.detect на https://github.com/uqfoundation, где есть несколько методов, которые можно использовать для диагностики объектов, которые вы привязываете к засолке. Например, если вы установите dill.detect.trace(True), он распечатает все внутренние вызовы для выбора объектов, пока ваш объект сбрасывается.

Другие вопросы по тегам