2

在我的项目中,我会定期使用酸洗来表示流程的内部状态以实现持久性。作为正常操作的一部分,对对象的引用被添加到多个其他对象中或从多个其他对象中删除。

例如,Person 可能有一个名为 address_list(一个列表)的属性,其中包含代表他们试图出售的所有属性的 Address 对象。另一个对象 RealEstateAgent 可能有一个名为addresses_for_sale 的属性(也是一个列表),它包含相同类型的Address 对象,但仅包含在其代理机构中列出的那些。

如果卖方将其财产从市场上撤下或出售,则地址将从两个列表中删除。

Persons 和 RealEstateAgents 都是用于酸洗的中心对象(Masterlist)列表的成员。我的问题是,当我添加和删除属性并随着时间的推移反复腌制 Masterlist 对象时,腌制文件的大小会增长,即使我删除(实际上是删除)比我添加的更多的属性。我意识到,在酸洗 Masterlist 中,有一个循环引用。我的应用程序中有许多循环引用。

我使用 pickletools.dis() 检查了 pickle 文件,虽然很难人工阅读,但我看到对已删除地址的引用。我确信它们已被删除,因为即使在 unpickling 之后,它们也不存在于各自的列表中。

虽然应用程序在酸洗/取消酸洗之前和之后都能正常运行,但不断增长的文件大小是一个问题,因为该过程需要长时间运行,并且重新初始化它不是一种选择。

我的例子是概念性的,问起来可能有点牵强,但我想知道是否有人有使用泡菜的垃圾收集问题的经验,当它们包含循环引用或其他任何可能指出我调试这个正确方向的东西时. 也许一些有用的工具。

非常感谢

4

1 回答 1

2

您可能想尝试一下objgraph……它可以帮助您跟踪内存泄漏和循环引用以及对象之间的指针关系。

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

我在调试泡菜时使用它(在我自己的泡菜包中dill)。

此外,某些腌制对象将(沿着腌制链)腌制全局,并且通常是腌制对象内循环引用的原因。

我还有一套 pickle 调试工具dill。请参阅https://github.com/uqfoundationdill.detect,其中有几种方法可用于诊断您要腌制的对象。例如,如果您设置,它将在转储对象时打印出所有对泡菜对象的内部调用。dill.detect.trace(True)

于 2014-09-03T19:41:13.107 回答