哪些操作会导致Python内存溢出,怎么处理?

Nicycycy


你好,感谢你的提问,刚好前段时间我也遇到过Python内存溢出的情况。我把我的例子与你分享,希望对你有所帮助。

内存溢出的情况:你使用malloc或new向 内存申请了一块内存空间,但没有用free以及delete对该块内存进行释放,造成程序失去了对该块内存的控制。

我的处理办法是:

在原生的编译器中,如果进行如下定义

a=1000

b=1000

print id(a),id(b)

会发现,两个的结果是不同的。id()是用来查看对象的内存地址的,如果我们定义大量的int变量,就有了内存溢出的可能性。

查了下,python对于小整数对象,[-5, 257),是预分配内存地址的。如果超出这个范围则使用通用的缓冲池,对于大整数则有PyIntBlock,用来作缓冲池。所以出现了我们上述的现象。

对int类变量值相同的情况,如果使用a=b=1000来定义,id(a)和id(b)的内存地址就是同一个了,可以一定程度上降低溢出的可能。

非原生的编译器中,貌似对上述情况进行过优化。在eclipse中测试,同样值,通常都是同一个内存地址。





往日好食光


内存溢出

内存溢出(Out Of Memory,简称OOM)是指应用系统中存在无法回收的内存或使用的内存过多,最终使得程序运行要用到的内存大于能提供的最大内存。此时表现为程序无法运行,系统提示内存溢出,有时甚至会自动关闭软件。


Python 内存溢出原因概括:

  1. 内存中加载的数据量过于庞大,比如一次性从数据库取出的数据量过大;

  2. 引用多个对象后,未进行清空操作,仍一直占用内存;

  3. 代码中存在死循环或循环产生过多重复的对象实体(同二);

  4. 引用的第三方模块存在BUG;

  5. 启动参数内存值设定过小。


解决方法:

Python 内存溢出的解决方法,主要是根据内存溢出的具体原因来进行,有如下:

  1. 检查程序项目中是否存在从数据库中一次性获得大量数据的查询操作(最好采用分页方式进行查询);

  2. 检查程序项目中是否存在死循环或递归调用;

  3. 检查程序项目中是否存在因循环而重复产生的新对象实体;

  4. 检查程序项目中是否存在使用定义对象后未清空的现象;

  5. 使用内存查看工具动态查看内存使用情况,实时监测。

总结:

“内存溢出”这一现象贯穿于整个软件开发史,是每个程序开发人员都应该重视和注意的地方,其引发的问题可大可小,不容忽视。作为一个合格的编程开发人员,应该养成一个好的编程习惯,比如:引用对象后应及时释放内存。这样一来,就可大大降低发生内存溢出的可能性。


如果喜欢,可以关注我,谢谢!


分享到:


相關文章: