0

好吧,我尝试了很多东西,我几乎确信没有办法解决我的问题。我开始了……我正在用 tkinter 编写一个简单的软件,在该软件的一部分中,我使用 matplotlib 和底图向用户提供一些地图。问题是在这些地图中加载了相对大量的数据,并且在某些计算机中,如果用户打开许多地图可能会出现问题。mu 代码的一部分(关键)是:

def plota_bacia():  
    global status_shape,pontos,arq
    print status_shape 
    if status_shape == True:
    fig = pyl.figure(figsize=(12,8))
        fig.canvas.set_window_title('Bacia fornecida pelo arquivo: '+arq)
        fig.patch.set_facecolor('white')
        m = Basemap(projection='merc',llcrnrlat=-32.5,urcrnrlat=5.0,llcrnrlon=-65.0,urcrnrlon=-33.0,lat_ts=20,resolution='c')
        parallels = arange(-50.,20,0.5)
        meridians = arange(-90.,0.,0.5)
        ptos = []
        for x,y in zip(pontos[0],pontos[1]): 
            x1,y1=m(x,y)
            ptos.append((x1,y1))
        p = Polygon(ptos,facecolor='red',edgecolor='green',linewidth=1) 
        pyl.gca().add_patch(p) 

        pyl.title(arq)
        xmin,ymin = m(min(pontos[0])-0.5,min(pontos[1])-0.5)
        xmax,ymax = m(max(pontos[0])+0.5,max(pontos[1])+0.5)
        m.drawparallels(parallels,labels=[1,0,0,0],fontsize=16)
        m.drawmeridians(meridians,labels=[0,0,0,1],fontsize=16)       
        m.readshapefile(dir_shape+'Brasil/BRASIL','r')
        pyl.xlim([xmin,xmax])
        pyl.ylim([ymin,ymax])
        pyl.show()
    else:tkMessageBox.showinfo( "Gráfico da bacia","Entre com uma bacia",parent=top)

做一些测试我明白问题在于python如何管理内存,例如:

from pylab import *
f = range(1,10000000,1)
plot(f)
show()
del f ; gc.collect()

如果我将“del f ; gc.collect()”行放在第二行之后(“f = range(1,10000000,1)”),我会释放一些与删除变量“f”相关的空间,但是一旦我绘制“f”,我假设一个 matplotlib 对象连接到与“f”相关的内存部分,因此我无法释放那部分内存。那是对的吗?我尝试了 cla()、clf()、close(),但这对我没有帮助。对不起,如果我做了一些愚蠢的事情,我用 python 编写了很多东西,但我是环境工程师,而不是程序员。非常感谢!

4

1 回答 1

0

pyl.show()添加后pyl.close(fig.number); del fig

于 2013-07-25T18:41:19.157 回答