PyYAML 内存泄漏

joa*_*pez 5 python garbage-collection yaml memory-leaks garbage

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

我已按照以下步骤操作:

import yaml
d = yaml.load(open(filename, 'r'))
Run Code Online (Sandbox Code Playgroud)

由该方法所使用的存储器(我已经得到它tophtop)从生长60K160M,而文件的大小是低于1M

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

sys.getsizeof(d)
Run Code Online (Sandbox Code Playgroud)

并且它返回的值低于400K

我也尝试将垃圾收集器与 一起使用gc.collect(),但什么也没发生。

如您所见,似乎存在内存泄漏,但我不知道是什么导致了它,也不知道如何释放这么多内存。

任何的想法?

Ant*_*hon 2

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

如果你愿意这样做:

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

并且程序使用的内存大小会根据您的设置而变化X,那么有理由假设存在内存泄漏。

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

多次加载 YAML 数据不会增加该数据,因此load()会归还其使用的内存,这意味着不存在内存泄漏。

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

(我使用safe_load()PyYAML 的文档表明这load()对于不受控制的输入文件是不安全的)。