2

在我的項目中,我定期使用pickling來表示持久化過程的內部狀態。作爲正常操作的一部分,對象的引用被添加到多個其他對象並從中移除。在pickle中仍然引用的已刪除對象

例如人可能有一個屬性,叫做包含代表所有他們正試圖出售屬性的地址對象ADDRESS_LIST(列表)。另一個對象RealEstateAgent可能有一個名爲addresses_for_sale(也是一個列表)的屬性,其中包含相同類型的Address對象,但只包含那些在其代理處列出的對象。

如果賣家將自己的財產從市場上拿走,或者賣出,則從兩個列表中刪除地址。

Persons和RealEstateAgent都是用於酸洗的中央對象(Masterlist)列表的成員。我的問題是,隨着時間的推移,添加和刪除屬性並重復使用Masterlist對象,pickle文件的大小會增加,即使我已經刪除了(實際上)比我添加的更多屬性。我意識到,在醃製Masterlist中,有一個循環引用。我的應用程序中有很多循環引用。

我檢查使用pickletools.dis()鹹菜文件,而這是很難的人讀的,我看到了已被刪除的地址的引用。我相信他們被刪除,因爲即使在取消之後,他們也不存在於他們各自的名單中。

當應用程序正常運行前和酸洗/在unpickle後,越來越多的文件大小是過程,就是要長時間運行的問題,並重新初始化它不是一個選項。

我的例子是名義上的,它可能是一個問題,但我想知道是否有人有使用pickles的垃圾回收問題,當它們包含循環引用或其他任何可能指向我的權利調試這個方向。也許有些工具會有幫助。

非常感謝

+0

我最終使用了objgraph和heapy來查找泄漏源 - 非常感謝。噢,引用實際上仍然在對象中,一旦裝入內存,就不在我期望的地方。這對複雜的對象關係來說是一個很好的工具! – domoarrigato 2014-09-04 13:44:16

回答

2

你可能想嘗試objgraph ...它可以認真幫助您跟蹤內存泄漏和循環引用和對象之間的指針關係。

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

我調試泡菜(名爲dill我自己的酸洗包)時使用它。

而且,某些酸洗對象將(向下鹹菜鏈)泡菜全局變量,並且是經常pickle對象內循環引用的原因。

我也有dill一套泡菜調試工具。請參閱dill.detect,地址爲https://github.com/uqfoundation,其中有幾種方法可用於診斷您正在試圖醃製的對象。例如,如果你設置了dill.detect.trace(True),它將打印出所有的內部調用,以便在你的對象被轉儲的時候清理對象。

+0

非常酷的模塊。花了一些時間來探索我的代碼產生的類似spagetti的圖表。但是,我無法在內存中找到類型爲Address的任何對象的引用。使用:objgraph.by_type('Address'),即使它們似乎在pickle文件中。你提到用objgraph直接探究pickle,任何關於如何的指針? – domoarrigato 2014-09-04 06:46:52

+0

我沒有說它可以直接探索鹹菜,但它是調試醬菜時使用的一個好工具。看到我上面的編輯。 – 2014-09-04 11:52:18

相關問題