Python绘图循环 - 我的记忆在哪里?

时间:2017-05-04 15:24:50

标签: python memory matplotlib matplotlib-basemap

我有以下循环绘制图形,然后将其保存到磁盘上,反复重复120次。 Python的RAM使用最初约为2.2GB(Data和SeaP阵列为120x721x1440),因此非常大。然而,每次循环迭代都会增加RAM的使用量,以至于在通过(i = 30)的过程中,RAM使用量增加了7.9GB。有内存泄漏吗?或者我可以防止这种增加的方式,我认为没有理由为什么它应该增加 - 代码是微不足道的。以下问题循环中的代码。

from mpl_toolkits.basemap import Basemap
import matplotlib.pyplot as plt
import numpy as np
from scipy.ndimage.filters import minimum_filter, maximum_filter


Lon = np.linspace(-180,180,1440)
Lat = np.linspace(-90,90,721)
Lon,Lat = np.meshgrid(Lon,Lat)


m = Basemap(projection='laea',width=10000000,height=6500000,resolution ='l',lat_ts=50,lat_0=55,lon_0=-25)
X, Y = m(Lon, Lat)

def Make_SLP(PRMSL,X,Y,Cont_Int,window=30):

    mn = minimum_filter(PRMSL, size=window, mode='wrap')
    mx = maximum_filter(PRMSL, size=window, mode='wrap')         
    local_min, local_max = np.nonzero(PRMSL == mn), np.nonzero(PRMSL == mx)
    clevs = np.arange(900,1100.,4.)

    csl = m.contour(X,Y,PRMSL,np.arange(950,1050,Cont_Int),colors='k',linewidths=0.3)
    xlows = X[local_min]; xhighs = X[local_max]
    ylows = Y[local_min]; yhighs = Y[local_max]
    lowvals = PRMSL[local_min]; highvals = PRMSL[local_max]

    xyplotted = []
# don't plot if there is already a L or H within dmin meters.
    yoffset = 0.022*(m.ymax-m.ymin)
    dmin = yoffset
    for x,y,p in zip(xlows, ylows, lowvals):
        if x < m.xmax and x > m.xmin and y < m.ymax and y > m.ymin:
            dist = [np.sqrt((x-x0)**2+(y-y0)**2) for x0,y0 in xyplotted]
            if not dist or min(dist) > dmin:
                plt.text(x,y,'L',fontsize=16,fontweight='bold',
                         ha='center',va='center',color='b',clip_on=True)
                plt.text(x,y-yoffset,repr(int(p)),fontsize=9,
                         ha='center',va='top',color='b',
                         bbox = dict(boxstyle="square",ec='None',fc=(1,1,1,0.5)),clip_on=True)
                xyplotted.append((x,y))
    # plot highs as red H's, with max pressure value underneath.
    xyplotted = []
    for x,y,p in zip(xhighs, yhighs, highvals):
        if x < m.xmax and x > m.xmin and y < m.ymax and y > m.ymin:
            dist = [np.sqrt((x-x0)**2+(y-y0)**2) for x0,y0 in xyplotted]
            if not dist or min(dist) > dmin:
                plt.text(x,y,'H',fontsize=16,fontweight='bold',
                         ha='center',va='center',color='r',clip_on=True)
                plt.text(x,y-yoffset,repr(int(p)),fontsize=9,
                         ha='center',va='top',color='r',
                         bbox = dict(boxstyle="square",ec='None',fc=(1,1,1,0.5)),clip_on=True)
                xyplotted.append((x,y))
    return plt


for i in range(0,100):

    plt = Make_SLP(np.random.rand(721,1440)*1000,X,Y,10,window=30)


    print i

0 个答案:

没有答案