2

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

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

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

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

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

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

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

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

+0

В конечном итоге я использовал objgraph и heapy, чтобы найти источник утечки - большое спасибо. Ох, и ссылки на самом деле остались в объекте, однажды загруженном в память, а не там, где я их ожидал. Это отличный инструмент для сложных отношений объектов! – domoarrigato

ответ

2

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

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

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

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

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

+0

очень классный модуль. Потратили некоторое время на изучение диаграмм, подобных спагетти, которые генерирует мой код :) Однако я не могу найти ссылки в памяти на любые объекты типа Address. Использование: objgraph.by_type ('Address'), хотя они, похоже, находятся в файле pickle.Вы упомянули, используя objgraph, чтобы исследовать рассол прямо, любые указатели на то, как? – domoarrigato

+0

Я не сказал, что он может исследовать рассол напрямую, но это хороший инструмент, который я использую при отладке соленья. См. Мое редактирование выше. –

 Смежные вопросы

  • Нет связанных вопросов^_^