内存泄漏与PyYAML

时间:2016-06-14 10:24:16

标签: python memory-leaks garbage-collection yaml garbage

我认为在使用库PyYAML加载.yml file时出现内存泄漏。

我已经按照接下来的步骤进行了操作:

import yaml
d = yaml.load(open(filename, 'r'))

流程使用的内存(我已将tophtop获得)已从60K增加到160M,而文件大小较低比1M

然后,我完成了下一个命令:

sys.getsizeof(d)

它返回的值低于400K

我也尝试将垃圾收集器与gc.collect()一起使用,但没有发生任何事情。

正如你所看到的,似乎存在内存泄漏,但我不知道是什么产生了它,我也不知道如何释放这些内存。

有什么想法吗?

1 个答案:

答案 0 :(得分:0)

您的方法没有显示内存泄漏,它只是表明PyYAML在处理中等大小的YAML文件时会占用大量内存。

如果你愿意:

import yaml
X = 10
for x in range(X):
    d = yaml.safe_load(open(filename, 'r'))

程序使用的内存大小会根据您设置X的内容而改变,然后有理由假设存在内存泄漏。

在我运行的测试中,情况并非如此。只是默认的Loader和SafeLoader占用内存中大约330x的文件大小(基于任意1Mb大小的简单,即没有标签,YAML文件)和CLoader大约145x文件大小。

多次加载YAML数据不会增加,因此load()会回放它使用的内存,这意味着没有内存泄漏。

这并不是说它看起来像是一个巨大的开销。

(我正在使用safe_load(),因为PyYAML的文档表明load()在不受控制的输入文件上不安全。)