使用python循环打印图像时出现内存错误

使用python循环打印图像时出现内存错误,python,matplotlib,plot,Python,Matplotlib,Plot,所以我有很多图像是为了数据质量控制而绘制的。我使用嵌套循环遍历并提取gzip文件,然后将图像打印并保存为.png,以便以后参考。我可以让它运行一段时间,但最终我会得到一个内存错误。我不知道我是否犯了愚蠢的错误,任何帮助都是感激的 我曾尝试制作临时文件夹,将gzip文件解压缩到其中,然后将其删除。我也尝试过在循环中每次绘制完之后关闭所有的绘图,但是运行了一段时间后仍然会出现内存错误。我在谷歌上搜索了一下,发现了刷新和fsync的问题,以及gzip文件位于NTFS格式的外部硬盘上的事实,但这就是我丢

所以我有很多图像是为了数据质量控制而绘制的。我使用嵌套循环遍历并提取gzip文件,然后将图像打印并保存为.png,以便以后参考。我可以让它运行一段时间,但最终我会得到一个内存错误。我不知道我是否犯了愚蠢的错误,任何帮助都是感激的

我曾尝试制作临时文件夹,将gzip文件解压缩到其中,然后将其删除。我也尝试过在循环中每次绘制完之后关闭所有的绘图,但是运行了一段时间后仍然会出现内存错误。我在谷歌上搜索了一下,发现了刷新和fsync的问题,以及gzip文件位于NTFS格式的外部硬盘上的事实,但这就是我丢失的地方

以下是我的相关代码:

while len(thelist) > 0 :
    temppath = tempfile.mkdtemp()
    os.chdir(temppath)

    tpath = thelist.pop()

    myextractor.myextract(tpath)

    paths = glob('*HRV')+glob('*.IR120')+glob('*.WV73')+glob('*.VIS8')+glob('*.VIS120')+glob('*.VIS6')+glob('*.IR16')

for x in range(0, len(paths)):
    #get the files and paths correct
    spath ='/' + paths.__getitem__(x)
    spath1 = spath.replace('\\','/')
    spath = temppath+ spath1
    spath = spath.replace('\\','/')

    r = 0
    r=McIdasObject.McIdasImageFile(spath)
    #the semi colon is important ..maybe

    fig = plt.imshow (np.array(r));

    #most of this is just getting the correct file and path name
    strpath = str(temppath)
    strpath = strpath.replace('c:\\users\\appdata\\local\\temp\\','/')
    folder = tpath[20]+tpath[21]+tpath[22]+tpath[23]+tpath[24]+tpath[25]+tpath[26]+tpath[27]+tpath[28]
    newpath = savepath + '/' + folder
    if not os.path.exists(newpath): os.makedirs(newpath)
        print 'saving:' + newpath + spath1 + '.png'


    plt.savefig(newpath + spath1+ '.png')
    r=0
    plt.close("all")


    gc.collect()
os.chdir(destin)
if len(paths) < 1 :
    badimages.append(temppath)
else:
    shutil.rmtree(temppath)
这是追溯

回溯最近一次呼叫上次:

文件,第1行,在 运行文件'C:/Users/Alex/Documents/Python Scripts/image printer.py',wdir='C:/Users/Alex/Documents/Python Scripts' 文件C:\Users\Alex\Anaconda\lib\site packages\spyderlib\widgets\externalshell\sitecustomize.py,第682行,在runfile中 execfilefilename,命名空间 文件C:\Users\Alex\Anaconda\lib\site packages\spyderlib\widgets\externalshell\sitecustomize.py,第71行,在execfile中 execcompilescripttext,文件名,“exec”,glob,loc 文件C:/Users/Alex/Documents/Python Scripts/image printer.py,第57行,in plt.savefignewpath+spath1+'.png' 文件C:\Users\Alex\Anaconda\lib\site packages\matplotlib\pyplot.py,第577行,在savefig中 res=图savefig*参数,**kwargs 保存图中的文件C:\Users\Alex\Anaconda\lib\site packages\matplotlib\figure.py,第1476行 self.canvas.print_figure*args,**kwargs 文件C:\Users\Alex\Anaconda\lib\site packages\matplotlib\backends\backend\u qt5agg.py,第161行,如图所示 FigureCanvasAgg.print_figureself,*args,**kwargs 文件C:\Users\Alex\Anaconda\lib\site packages\matplotlib\backend\u base.py,第2211行,如图所示 **夸尔斯 文件C:\Users\Alex\Anaconda\lib\site packages\matplotlib\backends\backend\u agg.py,第521行,打印为png 图Canvasagg.drawself 文件C:\Users\Alex\Anaconda\lib\site packages\matplotlib\backends\backend\u agg.py,第469行,在绘图中 self.figure.drawself.renderer 文件C:\Users\Alex\Anaconda\lib\site packages\matplotlib\artist.py,第59行,在draw\u包装中 绘图艺术家,渲染器,*args,**kwargs 文件C:\Users\Alex\Anaconda\lib\site packages\matplotlib\figure.py,第1085行,在绘图中 func*args 文件C:\Users\Alex\Anaconda\lib\site packages\matplotlib\artist.py,第59行,在draw\u包装中 绘图艺术家,渲染器,*args,**kwargs 文件C:\Users\Alex\Anaconda\lib\site packages\matplotlib\axes\\u base.py,第2110行,在绘图中 a、 绘图渲染器 文件C:\Users\Alex\Anaconda\lib\site packages\matplotlib\artist.py,第59行,在draw\u包装中 绘图艺术家,渲染器,*args,**kwargs 文件C:\Users\Alex\Anaconda\lib\site packages\matplotlib\image.py,第373行,在绘图中 im=self.make\u imagerenderer.get\u image\u放大率 文件C:\Users\Alex\Anaconda\lib\site packages\matplotlib\image.py,第597行,在make\u image中 转换的视域 文件C:\Users\Alex\Anaconda\lib\site packages\matplotlib\image.py,第219行,在\u get\u unsampled\u image中 x=x*255.astypenp.uint8 记忆者
这里有一个与您的问题相同的简单示例。在我的机器上,这会导致ipython耗尽所有内存,然后崩溃:

import matplotlib.pyplot as plt
import numpy as np

for ii in np.arange(1000):
    fig = plt.imshow(np.random.random([1000,1000]))
下次,如果你能弄明白,试着提供一个尽可能小的例子,删除所有不重要的代码

与其每次都重新创建地物,不如尝试创建一次地物并重新使用:

import matplotlib.pyplot as plt
import numpy as np

fig = plt.imshow(np.random.random([1000,1000]))
for ii in np.arange(1000):
    fig.set_data(np.random.random([1000,1000]))

请修正问题中代码的缩进。你从哪儿弄来的纪念品?请添加问题发生时的回溯。好的,我现在正在运行代码以获取错误,请尝试将for x中除最后一行以外的所有代码放入一个单独的函数中,然后在循环中调用它,然后调用gc.collect。从新函数返回将遵从其中定义的所有局部变量,这可能会使垃圾收集器做得更好。我将在代码中处理这些变量,看看它是否有效。您还应该将导入matplotlib.pyplot作为plt移动到单独的函数中。好的,谢谢,我明天会试试看它是否有效。所以我尝试重新使用这个数字,我所有的输出图像都被弄乱了,作为参考,这些图像是25002500或37253725或50005000或113001300。这对他们中的任何人都不起作用。另外,当我在fig=plt.imshownp.random.random[10001000]后面放置plt.close'all'时,代码不会崩溃…?我还刚刚在50005000维上进行了测试,它确实崩溃了,所以我将继续研究它