绘制大量图像时的Matplotlib分割错误

时间:2016-01-04 13:30:14

标签: python matplotlib segmentation-fault

我有将3D numpy数组绘制成图像堆栈的函数:

def plotImages( 
    prefix, F, slices,
    extent=None, zs = None, figsize=default_figsize, 
    cmap=default_cmap, interpolation=default_interpolation, vmin=None, vmax=None, cbar=False, 
    ):
    for ii,i in enumerate(slices):
        print " plotting ", i
        plt.figure( figsize=figsize )
        plt.imshow( F[i], origin='image', interpolation=interpolation, cmap=cmap, extent=extent, vmin=vmin, vmax=vmax )
        if cbar:
            plt.colorbar();
        plt.xlabel(r' Tip_x $\AA$')
        plt.ylabel(r' Tip_y $\AA$')
        if zs is None:
            plt.title( r"iz = %i" %i  )
        else:
            plt.title( r"Tip_z = %2.2f $\AA$" %zs[i]  )
        plt.savefig( prefix+'_%3.3i.png' %i, bbox_inches='tight' )
        plt.close()

我在循环中调用这个函数用于~20个datagrids(3D numpy数组),每个数组有~50个切片=>它会生成~20 x ~50 = ~1000张图片。

但是在几百张图片之后,它与Segmentation fault (core dumped)崩溃了。这个问题非常难以跟踪,因为它是随机出现的,并且需要很长的运行时间(10分钟)才能崩溃。

我很确定问题出在matplotlib(或numpy?)中,因为它在这个循环的中间崩溃,只有matplotlib函数。

另外我认为它可能取决于内存使用情况(?)。我打开的程序越多,问题就越早出现。当我开始清理内存(在我的数据网格上调用plt.close()delete F)时,问题也会减少(稍后出现)。我在想如果它与垃圾收集或类似的东西有关系?

  1. 你知道什么是可能的问题吗?
  2. 您建议采用什么策略来追踪它?
  3. 编辑:我制作了这个非常简单的人工示例,重现了崩溃

    import numpy as np
    import matplotlib.pyplot as plt
    
    default_figsize = (3,3)
    
    def plotImages( prefix, F, figsize=default_figsize ):
        slices = range( len( F ) )
        for ii,i in enumerate(slices):
            print " plotting ", i
            plt.figure( figsize=figsize )
            plt.imshow( F[i], origin='image' )
            plt.title( r"iz = %i" %i  )
            plt.savefig( prefix+'_%3.3i.png' %i, bbox_inches='tight' )
            plt.close()
    
    
    nx = 500
    ny = 500
    nz = 100
    ng = 100
    
    for i in range( ng ):
        F = np.random.randn( nz,ny,nx )
        print "NEW GRID ", i , " : ", np.shape(F)
        plotImages( "", F )
        del F
    

    在网格#12切片#54之后显示Segmentation fault (core dumped)这意味着在11x100 + 54 = 1154图像之后绘制

    输出如下:

    NEW GRID  12  :  (100, 500, 500)
     plotting  0
     plotting  1
     plotting  2
     .... # ommited lines here
     plotting  50
     plotting  51
     plotting  52
     plotting  53
     plotting  54
    Segmentation fault (core dumped)
    

0 个答案:

没有答案