内存错误,是否有命令可以在程序结束时释放内存?
我正在尝试优化我的程序,但我已经无法再简化它了。出现了“内存错误”。
关于程序:
我在处理大量数据,并且使用了scipy.interpolate来获取最终所需的数据映射。同时,我的对象也很简单。
我的问题和尝试过的解决方案:
我的程序并不是每次都会出现“内存错误”,大约有8成的时间它都能正常运行。而且如果我关闭环境再重新运行,它又能完美工作。所以我想使用类似gc.collect()的命令,但这并没有帮助。有没有什么命令可以在程序执行结束时清理所有内存和变量,就像在Matlab中那样?我对Python还很陌生。
谢谢!!
设置基底地图并将其缩放到感兴趣的位置
m = basemap.Basemap( llcrnrlon = int(rec_long - 15), llcrnrlat = int(rec_lat - 15) ,
urcrnrlon = int(rec_long + 15), urcrnrlat = int(rec_lat + 15), projection='merc', resolution = 'l' ,
lat_0 = rec_lat , lon_0 = rec_long )
m.drawcoastlines(ax=ax)
m.drawmapboundary(fill_color='0.3')
m.fillcontinents(color='gray', lake_color='aqua', ax=ax)
parallels=numpy.linspace(-90,90,6)
m.drawparallels(parallels, labels=[1,1,1,1], fontsize=10)
meridians=numpy.linspace(-180,180,6)
m.drawmeridians(meridians, labels=[1,1,1,1], fontsize=10)
我创建网格
grid_x, grid_y = numpy.meshgrid(lx , ly)
将IP_magnitude插值到网格(x和y维度)
z = scipy.interpolate.griddata((val_rt_long, val_rt_lat), val_rt_data ,(grid_x,grid_y) ,method='nearest')
x , y = m(grid_x, grid_y)
使用pcolormesh绘制幅值
m.pcolormesh(x ,y , z, cmap=plt.cm.jet)
cb = m.colorbar(location='bottom',pad='7%')
1 个回答
你遇到内存不足的问题,是因为你使用的环境(Spyder)会保存一些数据,尽管你尝试使用了gc.collect()
来清理内存。这个环境的设计就是为了让你可以查看之前的结果,所以它会把这些数据缓存起来。当你多次运行代码时,内存中的缓存会越来越多,最终就会满。
当你关闭Spyder时,操作系统会释放Spyder使用的所有内存,包括那些为了查看而保留的数据。这是显而易见的:一旦你关闭了Spyder,就无法从内存中找回那些数据,你必须重新打开数据文件,再次读取数据。
你提到作为一个完整的脚本运行时内存占用很大。这不太合理:你在问题中展示的代码其实很少,而且在Spyder中和在独立脚本中的代码行数应该是一样的。只需添加一些导入语句,你就可以开始了。
当独立运行时,操作系统会在每次脚本结束时释放使用的内存。因此,内存中不会缓存任何数据,每次运行时,内存(和数据)都是从零开始的。
你提到你是Python的新手,但对Matlab比较熟悉。可以推测,你一直是在Matlab的命令行中运行代码。对于Python,尝试学习如何编写独立的脚本,并从操作系统(终端)命令行运行这些脚本;而不是在Python的开发或探索环境中。你可以在这些环境中进行快速探索和试错,但对于完整的数据处理,运行独立脚本会更好。