Python guppy所说的长期运行项目的奇怪内存消耗

Python guppy所说的长期运行项目的奇怪内存消耗,python,memory,memory-leaks,guppy,Python,Memory,Memory Leaks,Guppy,我有一个长期运行的Python项目,它在内存使用方面有一个缓慢但永久的增量。如果主脚本接收到大量要处理的工作,并且主进程和子进程都无限运行(或者直到删除目标作业),则主脚本将设置新进程(使用多进程) 为了试图了解内存泄漏的来源,我使用了guppy模块来分析我的内存,然后每两分钟进行一次将内存分析写入文件的处理 在检查内存配置文件时,我看到内存中只有一种类型在增加-list。其余类型中的值基本上是静态的(有时稍高,有时稍低) 例如,以下是其中一个流程的报告: Index Count %

我有一个长期运行的Python项目,它在内存使用方面有一个缓慢但永久的增量。如果主脚本接收到大量要处理的工作,并且主进程和子进程都无限运行(或者直到删除目标作业),则主脚本将设置新进程(使用多进程)

为了试图了解内存泄漏的来源,我使用了
guppy
模块来分析我的内存,然后每两分钟进行一次将内存分析写入文件的处理

在检查内存配置文件时,我看到内存中只有一种类型在增加-
list
。其余类型中的值基本上是静态的(有时稍高,有时稍低)

例如,以下是其中一个流程的报告:

 Index  Count   %     Size   % Cumulative  % Referrers by Kind (class / dict of class)
     0   3707  43   491717  58    491717  58 list
     1   4200  48   239659  28    731376  87 dict of CustomClass
     2    600   7    96000  11    827376  98 CustomClass
     3      4   0     4646   1    832022  98 _io.TextIOWrapper
     4     40   0     3664   0    835686  99 dict (no owner)
     5     46   1     3358   0    839044  99 urllib.parse.SplitResult
     6     90   1     2160   0    841204 100 dict of OtherCustomClass
     7     18   0     2080   0    843284 100 tuple
     8      1   0      424   0    843708 100 <Nothing>
     9      4   0      384   0    844092 100 types.FrameType
索引计数%Size%累计%referers(按类别/类别分类)
0 3707 43 491717 58 491717 58列表
1 4200 48 239659 28 731376 87客户等级目录
26007 96000 11 827376 98定制类
3 4 0 4646 1 832022 98_io.textio包装器
44003664083568699 dict(无所有者)
5 46 1 3358 0 839044 99 urllib.parse.SplitResult
6 90 1 2160 841204 100其他客户类别的dict
718020800843284100元组
8      1   0      424   0    843708 100 
9 4 0 384 0 844092 100类型。框架类型
如果任何其他类型的内存中的计数或大小增加,我可能已经知道哪个列表是内存泄漏的罪魁祸首,但因为只有
list
的大小在增加,我不确定应该如何处理,并找到哪个列表是泄漏的根源

此外,我的所有属于类实例的列表要么受大小限制,要么每个间隔都被清除(我确保调用了clear)。我在函数内部创建的其他列表,我希望在函数不再在作用域中时将其删除

我错过什么了吗? 非常感谢

考虑使用

在您的情况下,您可能需要执行以下操作:

redirect on
describe used
启动您的流程(不以任何方式检测)

例如,通过使用gcore获取该过程的活动核心,距离足够远,以显示增长

对于每个core,在第章中打开core并执行以下操作:

redirect on
describe used

因此,您将有两个文件(每个核心一个),您可以比较以查看哪些分配是新的或已消失。你的名单应该反映在那里。找到其中一个列表的地址,然后使用“解释”来了解它是如何使用的。

嘿,谢谢你的回复!它可能会有点问题,因为它是一个更大系统的一部分,在k8s中通过docker映像执行,所以在非仪器化和本地运行它可能会有点问题。我会试着看看我是否能成功