python内存不断增长

本文介绍了Python内存泄漏的常见原因,如全局变量引用和垃圾回收问题,并探讨了检查内存泄漏的工具,如gc、tracemalloc等。通过实例展示了如何使用tracemalloc定位内存占用高的对象。问题的根源在于未限制大小的图片队列,由于处理速度慢导致内存持续增长。解决方法是合理管理队列大小或优化处理速度。
摘要由CSDN通过智能技术生成

问题:python进程在10分钟之内,内存从35%涨到98%

1.内存泄漏的几种常见情况

  • 对象一直被全局变量所引用, 全局变量生命周期长.
  • 垃圾回收机被禁用或者设置成debug状态, 垃圾回收的内存不会被释放.

2.查看python内存泄露的工具

  • gc: python内置模块, 函数少功能基本, 使用简单
  • objgraph: 可以绘制对象引用图, 对于对象种类较少, 结构比较简单的程序适用,安装绘图库比较麻烦
  • guppy: 可以对堆里边的对象进行统计, 算是比较实用
  • pympler: 可以统计内存里边各种类型的使用, 获取对象的大小

上边这些虽然有用但是总是搞不到点子上, 都需要修改程序, 比较费劲。作用也较弱。下面两个库要强大一点:

  • tracemalloc: 究极强, 可以直接看到哪些对象占用了最大的空间, 这些对象是谁, 调用栈是啥样的,python3直接内置, python2如果安装的话需要编译(对python2不太友好)
  • pyrasite: 牛逼的第三方库, 可以渗透进入正在运行的python进程动态修改里边的数据和代码(其实修改代码就是通过修改数据实现)

3.实操
a.使用gc.isenabled()判断gc是否在工作, 结果发现是True, 也就是正常工作的, 而且使用gc.set_debug(gc.DEBUG_LEAK)设置gc为debug模式, 然后gc.collect()进行垃圾回收发现并没有更多内存释放,则否认了第二种泄露的可能.
b.tracemalloc-python标准库,此处只列出2个,更多例子请见文档
例子:

import tracemalloc

tracemalloc.start()

# ... run your application ...
snapshot = tracemalloc.take_snapshot() # 快照,当前内存分配
top_stats = snapshot.statistics('lineno') # 快照对象的统计

for stat in top_stats:
    print(stat)

计算差异
拍摄两张快照并显示差异:

import tracemalloc
tracemalloc.start()
# ... start your application ...

snapshot1 = tracemalloc.take_snapshot()
# ... call the function leaking memory ...
snapshot2 = tracemalloc.take_snapshot()

top_stats = snapshot2.compare_to(snapshot1, 'lineno')

print("[ Top 10 differences ]")
for stat in top_stats[:10]:
    print(stat)

最终找到问题的问题是:我将读取的图片存储到队列中,然后从队列中取图片进行处理,因为队列没有设置大小(业务需求,图片全都要 ),处理速度较慢,导致队列里的东西太多了,内存增长
参考文章:https://cloud.tencent.com/developer/article/1115715

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值