1

我有一个 Python 应用程序,它会消耗 GB 的数据。为了跟踪我安装的内存使用情况,guppy并在一个时间单位后打印堆,我在报告中看到以下内容。

Partition of a set of 43325494 objects. Total size = 7524458264 bytes.
 Index  Count   %     Size   % Cumulative  % Kind (class / dict of class)
     0 2556102   6 2678794896  36 2678794896  36 dict of cocotb.binary.BinaryValue
...

现在,在我的应用程序的几十个模块中创建了 BinaryValue 类型的对象。要进行调试,我必须获取这些对象的行号/文件名/变量名。那么有什么方法可以获取这些信息吗?如果不是,那么我可以使用什么策略来解决问题的根源?

注意:由于 python 应用程序与 C 程序紧密耦合,因此无法以交互方式运行 python 代码,并且必须直接在代码中检测任何调试步骤。

4

1 回答 1

0

直接引用的“名称”显示在byvia属性中,例如:

heap()[0].byvia

考虑到您的设置是dict of [something]via 将永远是.__dict__,所以做 areferrers会更有用:

heap()[0].referrers.byvia

参考模式显示在rp属性中,从根(guppy 的遍历树)的最短路径显示在sp属性中:

heap()[0].rp
heap()[0].sp

我个人更喜欢过滤一组感兴趣的对象,然后从一组对象中获取一个 somgle 对象(例如:),然后.byid[0]做一条最短路径。

所有不同属性的文档是python 3版本python 2版本

于 2020-06-03T14:32:14.677 回答