【问题标题】:Memory error , is there any command to free memory at the end of the program execution?内存错误,程序执行结束时有没有释放内存的命令?
【发布时间】:2023-03-15 08:01:01
【问题描述】:

我正在尝试优化我的程序,但我无法再简化它。出现“内存错误”

关于节目:

我正在处理大量数据,并且还使用 scipy.interpolate 在最后获取数据所需的地图。并且还有最小的对象。

我的问题和尝试的解决方案:

令人惊讶的是,我的程序始终没有抛出任何“内存错误”,程序运行了 8/10 次。此外,如果我关闭环境并再次运行它,它会完美运行。所以我想我会使用 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 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%')

【问题讨论】:

  • 你能举一个具体的你内存不足的例子吗? “令人惊讶的是,我的程序始终没有抛出任何‘内存错误’,程序运行了 8/10 次”并没有真正的帮助。您是将其作为独立脚本运行,还是在 IPython 环境中运行?
  • 好问题;我所做的是重新启动内核并确保我没有运行其他内存密集型应用程序,但我想知道 Python 中是否存在“清除所有”/“cls”类型的命令。
  • “重启内核”。因此,您在 IPython 环境中运行,可能通过 IPython 笔记本。最好提一下。您最好创建一个独立的脚本并将其用于此类内存密集型计算:一旦脚本完成,操作系统将清除所有内存,您可以再次运行它而不必担心内存中剩余的数据。跨度>
  • 除此之外,delgc.collect() 可以帮助您,但我不会依赖它。
  • 我从 spyder 环境运行,python 2.7 是我使用的版本,我处理的数据文件是 6.6 mbytes。我有一个主脚本,我在其中对 5 个子程序进行一般调用并设置底图并进行插值和绘图,只有在我开始长时间进行插值后,纬度跨越 30 度、30 度的表面,我才得到这个“内存错误”...... . 使用 gc.collect 没有帮助,正如我之前提到的...... del 是什么??

标签: python memory


【解决方案1】:

尽管您尝试使用gc.collect(),但您的工作环境 (Spyder) 仍会跟踪一些数据,因此您的内存不足。这就是这个环境的用途:您可能想要返回一些较早的结果,它就在那里,由环境缓存。当您多次运行时,内存缓存会逐渐增加,并最终变满。

当您关闭 Spyder 时,操作系统会释放 Spyder 使用的所有内存,包括所有保留以供检查的内存。这很明显:一旦关闭 Spyder,就无法从内存中检索该数据:您必须重新打开数据文件并再次读取数据。

您说作为单个脚本运行是巨大的。这没有任何意义:您在问题中显示代码,这真的很少,而且 Spyder 中的代码行应该与独立脚本中的代码行相同。添加一些导入,您就可以开始了。

当独立运行时,每次脚本结束时操作系统都会释放使用的内存。所以不会有数据缓存在内存中,当多次运行时,内存(和数据)都是从空白开始的。

您提到您是 Python 新手,但习惯于 Matlab。大概,你总是从 Matlab 命令行运行东西。使用 Python,尝试学习如何编写独立脚本,并从操作系统(终端)命令行运行这些脚本; 在 Python 开发或探索环境中。您可以使用这些环境进行快速探索和反复试验,但对于完全成熟的数据处理,您最好运行独立脚本。

【讨论】:

  • 谢谢你的回复,是的,我现在不知道如何形成一个独立的脚本......而且我有很多导入模块,我粘贴的程序也只是一些行给出一个想法,而不是很多......
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-01-04
  • 2016-02-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多