嗯,我尝试了很多东西,我几乎相信没有办法解决我的问题。 我来啦... 我正在用tkinter编写一个简单的软件,在这个软件的一部分中,我使用matplotlib和basemaps为用户提供一些地图。 问题是,在那些地图中加载了相对大量的数据,而在某些计算机中,如果用户打开许多地图,则可能会出现问题。 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()
如果我在第二个(“f = range(1,10000000,1)”之后放置“del f; gc.collect()”行,我发布了一些与删除变量“f”相关的空间,但是一旦我绘制了“f”,我就会把matplotlib对象连接到与“f”相关的内存部分,因此我无法释放那部分内存。 那是对的吗?我试过cla(),clf(),close(),这对我没用。 对不起,如果我做了一些愚蠢的事,我在python中编写了许多东西,但我是环境工程师,而不是程序员。 非常感谢!
答案 0 :(得分:0)
pyl.show()
后添加pyl.close(fig.number); del fig
。