我有将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
)时,问题也会减少(稍后出现)。我在想如果它与垃圾收集或类似的东西有关系?
编辑:我制作了这个非常简单的人工示例,重现了崩溃
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)