使用 pympler 识别 python 中哪些变量正在泄漏内存

问题描述 投票:0回答:2

我有一个存在内存泄漏的Python脚本,我可以使用pympler看到我的字典和列表对象正在增长:

from pympler import tracker
tr = tracker.SummaryTracker()
tr.print_diff() 

但是我还没有弄清楚如何列出代码中存在内存泄漏的变量名称。有人可以帮我列出变量名称以及该变量名称的代码用法吗?

谢谢

python memory
2个回答
2
投票

来自 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%

这是您要找的吗?


-1
投票

要列出已创建对象的变量名称,您可以将对 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)
© www.soinside.com 2019 - 2024. All rights reserved.