当前位置: 首页 > 面试题库 >

Python Matplotlib:指定图形大小时未释放内存

白侯林
2023-03-14
问题内容

我正在使用matplotlib生成许多数值模拟结果的图表。这些图用作视频中的帧,因此我通过重复调用与此函数类似的函数来生成许多图:

from pylab import *

def plot_density(filename,i,t,psi_Na):  
    figure(figsize=(8,6))
    imshow(abs(psi_Na)**2,origin = 'lower')
    savefig(filename + '_%04d.png'%i)
    clf()

问题在于,每次调用此函数时,python进程的内存使用量都会增加几兆字节。例如,如果我用以下循环调用它:

if __name__ == "__main__":
    x = linspace(-6e-6,6e-6,128,endpoint=False)
    y = linspace(-6e-6,6e-6,128,endpoint=False)
    X,Y = meshgrid(x,y)
    k = 1000000
    omega = 200
    times = linspace(0,100e-3,100,endpoint=False)
    for i,t in enumerate(times):
        psi_Na = sin(k*X-omega*t)
        plot_density('wavefunction',i,t,psi_Na)
        print i

然后ram的使用量会随着时间增长到600MB。但是,如果我figure(figsize=(8,6))在函数定义中注释掉该行,那么ram的使用将保持稳定在52MB。(8,6)是默认的图形尺寸,因此在两种情况下都会生成相同的图像。我想根据我的数值数据制作不同大小的图,而不会用完内存。如何强制python释放此内存?

我尝试了gc.collect()每个循环来强制进行垃圾收集,并且尝试f = gcf()获取当前数据然后del f将其删除,但无济于事。

我在64位Ubuntu 10.04上运行CPython 2.6.5。


问题答案:

从文档字符串中获取pylab.figure

In [313]: pylab.figure?

如果要创建许多图形,请确保在未使用的图形上显式调用“关闭”,因为这将使pylab正确清理内存。

所以也许尝试:

pylab.close()     # closes the current figure


 类似资料:
  • 问题内容: 我将一些matlpotlib函数集成到了一些django-celery任务中。 每次调用任务时,都会将更多RAM专用于python。不久之后,python占用了所有RAM。 问题: 如何释放此内存? 更新2-第二种解决方案: 我问过类似的问题,特别是有关内存锁定matplotlib错误的时候,但是我有一个很好的回答这个问题,以及如果使用多进程运行在单独的进程中绘图功能,其内存会自动释放

  • 我有一个问题,我的GPU内存是没有释放后关闭在Python中的tenstorflow会话。这三行足以导致问题: 在第三行之后,内存不会被释放。我在很多论坛上走来走去,尝试了各种各样的建议,但都没有效果。有关详细信息,请参见下面我的评论: https://github.com/tensorflow/tensorflow/issues/19731 在这里,我已经记录了我设法杀死进程并释放内存的方法,但

  • 问题内容: 我正在使用以下功能下载小于20MB的文件。它将全部内容读取到内存中,因为另一个功能必须先对字节执行工作,然后才能将其写入磁盘。 这可以正常工作,但是所有内存都在系统上消耗了。 是否可以在其他功能处理完之后释放使用的内存,以使内存使用量不会大于当前正在处理的字节数? 问题答案: 您可能会触发gc使用释放未使用的对象,并且可能敦促Go运行时使用释放内存到OS ,但是所有这些都只是在扑救。编

  • 本文向大家介绍PythonMatplotlib,包括了PythonMatplotlib的使用技巧和注意事项,需要的朋友参考一下 示例 Matplotlib是一个用于Python的数学绘图库,它提供了各种不同的绘图功能。 您可以在此处找到matplotlib文档,并在此处提供SO文档。 Matplotlib提供了两种不同的绘图方法,尽管它们在很大程度上可以互换: 首先,matplotlib提供了py

  • 假设我有一个大小为3841 x 7195像素的图像。我想将图中的内容保存到磁盘,从而得到我指定的像素大小的图像。 没有轴,就没有标题。只是图像而已。我个人并不关心DPI,因为我只想指定图像在屏幕上的大小(以磁盘为单位,以像素为单位)。 我读过其他线程,它们似乎都转换为英寸,然后以英寸为单位指定图形的尺寸,并以某种方式调整dpi。我希望避免处理像素到英寸转换可能导致的精度损失。 我尝试过: 运气不佳