pppfast上的matplotlib MemoryError

时间:2010-12-12 19:24:24

标签: python arrays memory-management numpy matplotlib

问题:

我目前正在将文本文件中的列数据加载到numpy数组中,然后绘制它们并保存生成的图像。因为值总是位于等间距的网格上,所以使用pcolorfast似乎是合适的时间。每个阵列必须是方形的,通常在1024x1024和8192x8192之间。目前,我只关注这项工作,包括4096x4096尺寸。这需要为数百个文件完成,并且当它成功完成第一个图像时,后续图像会因MemoryError而崩溃。

不成功的解决方案:

根据here,我确保我在rc中保持= False。

限制:

必须使用所有4096x4096值保存图像,并且无法缩小至1024x1024(建议here)。

说明:

在每个阶段观察内存使用情况(创建空数组,加载值,绘图,保存)后,在makeFrame完成后,数组A仍然位于内存中。显式调用是否需要删除它?是否需要明确删除fig,或者pylab应该如何处理?理想情况(可能很明显)是内存使用率恢复到与调用makeFrame()之前相同的水平。

非常感谢任何和所有建议。我一直试图解决这个问题几天,所以我不会错过任何明显的错误。显而易见的解决方案将是令人兴奋的(如果替代方案应该是这是一个更复杂的问题)。

当前代码示例:


import numpy
import matplotlib
matplotlib.use("AGG")
import matplotlib.pylab as plt

def makeFrame(srcName, dstName, coloring, sideLength,
              dataRanges, delim, dpi):
    v,V,cmap = coloring
    n = sideLength
    xmin,xmax,ymin,ymax = dataRanges
    A = numpy.empty((n,n),float)
    dx = (xmax-xmin) / (n-1)
    dy = (ymax-ymin) / (n-1)

    srcfile = open(srcName,'rb')
    for line in srcfile:
        lineVals = line[:-1].split(delim)
        x = float(lineVals[0])
        y = float(lineVals[1])
        c = float(lineVals[2])

        #Find index from float value, adjust for rounding
        i = (x-xmin) / dx
        if (i - int(i) ) > .05: i += 1

        j = (y-ymin) / dy
        if (j - int(j) ) > .05: j += 1

        A[i,j] = c
    srcfile.close()
    print "loaded vals"

    fig = plt.figure(1)
    fig.clf()
    ax = fig.gca()
    ScalarMap = ax.pcolorfast(A, vmin = v, vmax = V, cmap = cmap)
    fig.colorbar(ScalarMap)
    ax.axis('image')
    fig.savefig(dstName, dpi = dpi)
    plt.close(1)
    print "saved image"

1 个答案:

答案 0 :(得分:2)

注意事项:

  • 可能有更好的方式来处理 有这个记忆问题,我没有 知道。
  • 我无法重现这一点 错误。我用的时候 matplotlib.cbook.report_memory()我的 内存使用似乎达到了平衡 预期。

尽管存在警告,但我认为我会提到一种处理由拒绝释放内存的程序引起的问题的一般的廉价方法:使用multiprocessing模块在​​单独的进程中生成有问题的函数。等待功能结束,然后再次调用。每次子进程结束时,都会重新获得它使用的内存。

所以我建议尝试这样的事情:

import matplotlib.cbook as mc
import multiprocessing as mp
import matplotlib.cm as cm

if __name__=='__main__':
    for _ in range(10):
        srcName='test.data'
        dstName='test.png'
        vmin = 0
        vmax = 5
        cmap = cm.jet
        sideLength = 500
        dataRanges = (0.0,1.0,0.0,1.0)
        delim = ','
        dpi = 72
        proc=mp.Process(target=makeFrame,args=(
            srcName,dstName,(vmin,vmax,cmap),sideLength,
            dataRanges,delim,dpi))
        proc.start()
        proc.join()
        usage=mc.report_memory()
        print(usage)