我正在创建一个复杂系统中的扩散模拟,以任意图像为基底,允许任意创建扩散前沿,同时允许表面反应以及在起始基底上沉积新材料。到目前为止,我非常自豪的结果,你可以看看我用它制作的电影,这些电影是关于CVD和SFD在粒子上沉积的。在
不幸的是,我不能生成超过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}$
最后,我决定唯一合理的方法是将需要的每个帧渲染为.png,然后用avconv从图像生成一个电影。在
感谢您的所有建议,但由于未压缩图像的RAM使用,这似乎只是一个限制。在
相关问题 更多 >
编程相关推荐