Python内存问题matplotlib.animation

2024-06-16 14:24:10 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在创建一个复杂系统中的扩散模拟,以任意图像为基底,允许任意创建扩散前沿,同时允许表面反应以及在起始基底上沉积新材料。到目前为止,我非常自豪的结果,你可以看看我用它制作的电影,这些电影是关于CVD和SFD在粒子上沉积的。在

CVD Movie

SFD Movie

不幸的是,我不能生成超过50帧,因为内存不足。我试着在整个模拟过程中尽可能多地清除一些东西,但我想我一定遗漏了一些东西。总结一下:

我从创建一个空列表开始

ims = []

然后,每次我的“模拟”运行时,如果frame number % frame "rate" == 0,它会生成一个帧,它是:

  • 使用plt.ion()plt.draw()
  • 使用ims.append()将渲染图添加到动画帧数组中。在

在每一帧渲染之前,我运行plt.clf()以防止绘图的重叠绘图数量增加。在

如果没有ims.append()步骤,代码将消耗140到170MB的RAM。通过这一步,50帧将消耗近1.4GB的RAM。显然,这是非常有限的。50帧不错,但我真的想至少350帧。对于这种路由,这可能是不可能的,但这意味着内存的使用完全由ims数组执行,大约为每帧24MB。在

解决方法是创建帧并将其渲染到循环中的.svg.png文件并将其保存到磁盘。我发现这个渲染过程是非常占用CPU的,所以这样做通常会使代码相当慢。另外,创建350个PNG文件,然后手动将它们转换成视频是相当麻烦的,所以我很乐意以某种方式将其全部包含在程序本身中。在

有没有人知道如何减少这个示例代码的内存使用,而不必依赖于渲染和将每个帧写入磁盘?在

在这个玩具代码中,我只是使用了一个随机数生成器来填充注释中描述的两个数据集,以加快速度。在

代码:

^{pr2}$

Tags: 代码绘图电影过程plt数组movieframe
1条回答
网友
1楼 · 发布于 2024-06-16 14:24:10

最后,我决定唯一合理的方法是将需要的每个帧渲染为.png,然后用avconv从图像生成一个电影。在

感谢您的所有建议,但由于未压缩图像的RAM使用,这似乎只是一个限制。在

相关问题 更多 >