我有一个 python 脚本,它对不同的参数进行许多模拟(Q
, K
),绘制结果并将其存储到磁盘。
每组参数(Q,K
)生成 200x200x80 数据点的 3D 体积网格,这需要约 100 MB 的数据。然后逐层绘制该体积网格的一部分,生成约 60 张图像。
问题是python在这个过程中显然没有释放内存。我不确定内存泄漏在哪里,或者控制 python 如何决定释放哪些对象的规则是什么。我也不确定记忆是否丢失了numpy
数组或在matplotlib
图形对象。
- 有没有一个简单的分析方法python 中哪些对象保留在内存中,哪些对象被自动释放?
- 有没有一种强制 python 释放所有数组和图形对象的方法哪些是在特定循环或特定函数调用中创建的?
代码的相关部分在这里(但是,它不会运行......模拟代码的较大部分包括ctypes
C++/python接口因太复杂而省略):
import numpy as np
import matplotlib.pyplot as plt
import ProbeParticle as PP # this is my C++/Python simulation library, take it as blackbox
def relaxedScan3D( xTips, yTips, zTips ):
ntips = len(zTips);
print " zTips : ",zTips
rTips = np.zeros((ntips,3)) # is this array deallocated when exiting the function?
rs = np.zeros((ntips,3)) # and this?
fs = np.zeros((ntips,3)) # and this?
rTips[:,0] = 1.0
rTips[:,1] = 1.0
rTips[:,2] = zTips
fzs = np.zeros(( len(zTips), len(yTips ), len(xTips ) )); # and this?
for ix,x in enumerate( xTips ):
print "relax ix:", ix
rTips[:,0] = x
for iy,y in enumerate( yTips ):
rTips[:,1] = y
itrav = PP.relaxTipStroke( rTips, rs, fs ) / float( len(zTips) )
fzs[:,iy,ix] = fs[:,2].copy()
return fzs
def plotImages( prefix, F, slices ):
for ii,i in enumerate(slices):
print " plotting ", i
plt.figure( figsize=( 10,10 ) ) # Is this figure deallocated when exiting the function ?
plt.imshow( F[i], origin='image', interpolation=PP.params['imageInterpolation'], cmap=PP.params['colorscale'], extent=extent )
z = zTips[i] - PP.params['moleculeShift' ][2]
plt.colorbar();
plt.xlabel(r' Tip_x $\AA$')
plt.ylabel(r' Tip_y $\AA$')
plt.title( r"Tip_z = %2.2f $\AA$" %z )
plt.savefig( prefix+'_%3.3i.png' %i, bbox_inches='tight' )
Ks = [ 0.125, 0.25, 0.5, 1.0 ]
Qs = [ -0.4, -0.3, -0.2, -0.1, 0.0, +0.1, +0.2, +0.3, +0.4 ]
for iq,Q in enumerate( Qs ):
FF = FFLJ + FFel * Q
PP.setFF_Pointer( FF )
for ik,K in enumerate( Ks ):
dirname = "Q%1.2fK%1.2f" %(Q,K)
os.makedirs( dirname )
PP.setTip( kSpring = np.array((K,K,0.0))/-PP.eVA_Nm )
fzs = relaxedScan3D( xTips, yTips, zTips ) # is memory of "fzs" recycled or does it consume more memory each cycle of the loop ?
PP.saveXSF( dirname+'/OutFz.xsf', headScan, lvecScan, fzs )
dfs = PP.Fz2df( fzs, dz = dz, k0 = PP.params['kCantilever'], f0=PP.params['f0Cantilever'], n=int(PP.params['Amplitude']/dz) ) # is memory of "dfs" recycled?
plotImages( dirname+"/df", dfs, slices = range( 0, len(dfs) ) )