我有一个存在内存泄漏的Python脚本,我可以使用pympler看到我的字典和列表对象正在增长:
from pympler import tracker
tr = tracker.SummaryTracker()
tr.print_diff()
但是我还没有弄清楚如何列出代码中存在内存泄漏的变量名称。有人可以帮我列出变量名称以及该变量名称的代码用法吗?
谢谢
来自 Pympler 的文档:
可以实现跟踪某些类的对象的生命周期 与班级追踪器。这可以深入了解实例化模式 并有助于理解特定物体如何对记忆做出贡献 随着时间的推移,足迹:
>>> from pympler import classtracker
>>> tr = classtracker.ClassTracker()
>>> tr.track_class(Document)
>>> tr.create_snapshot()
>>> create_documents()
>>> tr.create_snapshot()
>>> tr.stats.print_summary()
active 1.42 MB average pct
Document 1000 195.38 KB 200 B 13%
这是您要找的吗?
要列出已创建对象的变量名称,您可以将对 Pympler 的
muppy.get_objects()
函数的调用与 referrers 库结合起来。例如:
import referrers
from pympler import summary, muppy
o1 = muppy.get_objects()
my_dict = {'a': [1]}
o2 = muppy.get_objects()
o1_ids = {id(obj) for obj in o1}
o2_ids = {id(obj): obj for obj in o2}
diff = [obj for obj_id, obj in o2_ids.items() if obj_id not in o1_ids]
summary.print_(summary.get_diff(summary.summarize(o1), summary.summarize(o2)), limit=2)
for obj in diff:
print(
referrers.get_referrer_graph(
obj,
exclude_object_ids=[id(o1), id(o2), id(diff), id(o2_ids)],
search_for_untracked_objects=True,
)
)
这将打印使用 Pympler 在
o1
和 o2
之间创建的对象的摘要,以及使用引用库引用这些对象的变量名称。输出将如下所示:
types | # objects | total size
======= | =========== | ============
list | 2 | 782.27 KB
dict | 1 | 232 B
╙── list instance (id=4452879296)
├─╼ o1 (global) (id=4452879296)
├─╼ obj (global) (id=4452879296)
├─╼ <module>.o1 (local) (id=4452879296)
└─╼ <module>.obj (local) (id=4452879296)
╙── dict instance (id=4453670592)
├─╼ <module>.my_dict (local) (id=4453670592)
├─╼ obj (global) (id=4453670592)
├─╼ my_dict (global) (id=4453670592)
└─╼ <module>.obj (local) (id=4453670592)
╙── list instance (id=4461235328)
├─╼ dict[a] (id=4453670592)
│ ├─╼ <module>.my_dict (local) (id=4453670592)
│ └─╼ my_dict (global) (id=4453670592)
├─╼ <module>.obj (local) (id=4461235328)
└─╼ obj (global) (id=4461235328)