【问题标题】:matplotlib MemoryError on pcolorfastpcolorfast 上的 matplotlib MemoryError
【发布时间】:2011-05-24 08:05:34
【问题描述】:

问题:

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

不成功的解决方案:

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

限制:

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

注意事项:

在观察每个阶段的内存使用情况(创建空数组、加载值、绘图、保存)之后,数组 A 在 makeFrame 完成后仍然位于内存中。是否需要明确调用来删除它? 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"

【问题讨论】:

    标签: python arrays memory-management numpy matplotlib


    【解决方案1】:

    注意事项:

    • 可能有更好的处理方式 有这个我没有的记忆问题 知道。
    • 我无法重现这个 错误。当我使用 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)
    

    【讨论】:

    • 到目前为止,这似乎运作良好。我真的不确定为什么我无法清除此内存,因为没有其他人能够重现它。我将全力以赴,如果可行,这是一个出色的答案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多