在我的項目中,我定期使用pickling來表示持久化過程的內部狀態。作爲正常操作的一部分,對象的引用被添加到多個其他對象並從中移除。在pickle中仍然引用的已刪除對象
例如人可能有一個屬性,叫做包含代表所有他們正試圖出售屬性的地址對象ADDRESS_LIST(列表)。另一個對象RealEstateAgent可能有一個名爲addresses_for_sale(也是一個列表)的屬性,其中包含相同類型的Address對象,但只包含那些在其代理處列出的對象。
如果賣家將自己的財產從市場上拿走,或者賣出,則從兩個列表中刪除地址。
Persons和RealEstateAgent都是用於酸洗的中央對象(Masterlist)列表的成員。我的問題是,隨着時間的推移,添加和刪除屬性並重復使用Masterlist對象,pickle文件的大小會增加,即使我已經刪除了(實際上)比我添加的更多屬性。我意識到,在醃製Masterlist中,有一個循環引用。我的應用程序中有很多循環引用。
我檢查使用pickletools.dis()鹹菜文件,而這是很難的人讀的,我看到了已被刪除的地址的引用。我相信他們被刪除,因爲即使在取消之後,他們也不存在於他們各自的名單中。
當應用程序正常運行前和酸洗/在unpickle後,越來越多的文件大小是過程,就是要長時間運行的問題,並重新初始化它不是一個選項。
我的例子是名義上的,它可能是一個問題,但我想知道是否有人有使用pickles的垃圾回收問題,當它們包含循環引用或其他任何可能指向我的權利調試這個方向。也許有些工具會有幫助。
非常感謝
我最終使用了objgraph和heapy來查找泄漏源 - 非常感謝。噢,引用實際上仍然在對象中,一旦裝入內存,就不在我期望的地方。這對複雜的對象關係來說是一個很好的工具! – domoarrigato 2014-09-04 13:44:16