Matplotlib:内存和 'CPU' 泄漏

Matplotlib: Memory and 'CPU' leak

python: 2.7
Ubuntu: 18.04
matpltolib: 2.2.2

我有一个客户端 GUI,可以从服务器获取信息并显示它。我看到内存泄漏和 CPU 消耗随时间变化。下图显示了使用 GUI 重新启动客户端后 CPU 和内存利用率的变化(从右边开始约 25 秒,与网络流量中的香料对齐)。

CPU 图表的 CPU 利用率有所下降,表明 CPU 使用率在程序重新启动前后有所不同。

内存图显示内存使用率大幅下降,然后由于同一程序的初始化而略有增加。

网络图有一个尖峰,因为客户端从服务器请求所有数据以进行可视化。

我怀疑是matplotlib的问题。我有 7 个数字,每 3 秒重新绘制一次图表。

我已经添加了我的 GUI 图像。中间4张图是历史图表。但是,我将所有数据点分装在 300 个分箱中,因为我在那个区域有大约 300 个像素。装箱是在一个单独的线程中完成的。存储信息的数据数组(2x1 000 000 点、时间和值)是从一开始就创建的,以确保我的数据集增长时不会出现任何内存失控问题。我不希望数据集的增长超出这个范围,因为典型的实验以 0.1-0.01 Hz 运行,这将需要几百万秒才能到达终点。

问:如果是Matplotlib,怎么办?如果不是,那还能是什么?

2018 年 9 月 6 日添加: 我想添加另一个示例。这是 CPU 的屏幕截图和我关闭 GUI 后的内存使用情况。代码 运行 ~ 3 天。 Python 2.7,Ubuntu 18.04.1。

谢谢大家的宝贵意见。 经过一番斗争,我找到了解决问题的方法。不幸的是,我对我的代码做了几处更改,所以我不能明确地说出真正有用的东西。

这里做了什么:

  1. 所有图表都是在单独的线程中完成的。图像使用 io.Bytes() 作为字节流保存在缓冲区中,然后传递给 GUI。这对我解决另一个问题很重要().

  2. 每次生成绘图时创建一个新图形(figure = Figure(figsize=(7,8),dpi=80))。以前我一直在重复使用相同的图形 (self.figure = Figure(figsize=(7,8),dpi=80))。