如何调试Python 程序的内存泄露问题

简介: 如何调试Python 程序的内存泄露问题

摄影:产品经理产品经理中的霸王餐

如果大家在 Linux 或者 macOS 下面运行一段可能导致内存泄露的程序,那么你可能会看到下面这样的情况:

而如果你用的系统是 Windows,那么可能电脑直接就卡死了。

但是,调试这种 OOM(Out of Memory)的问题有时候是非常困难的,因为你不知道代码哪个地方会导致内存泄露。但是如果你运行程序进行调试,程序又会中途被杀掉或者直接卡死系统。

如果我们有办法看到程序里面每一个函数占用的内存大小,那么我们就能缩小检查的范围。

为了实现这个目的,我们可以安装并使用一个叫做filprofiler的第三方库,它可以分析 Python 程序的内存占用情况。

我们先安装这个库:


pip install filprofiler

然后写一段会导致内存泄露的代码:



def func_a():    print('我是一个正常的函数')
def func_b():    print('我是第二个正常的函数')
def func_b():    print('我是第三个正常的函数')
def func_oom():    print('我是一个会导致内存泄露的函数')    datas = []    while True:        datas.append('s' * 1024 * 1024)    print('运行程序的时候,你不会看到这一行')
def run():    func_a()    func_b()    func_oom()
run()

这段程序直接运行会因为内存泄露的问题被系统直接杀死。

在使用filprofiler之前,还需要调整一下虚拟内存的大小。否则,filprofiler本身也会因为占用内存过大的问题而被系统杀掉。

先使用free命令看一下系统可用的内存有多少:

系统可用内存为1619456 KB

我们使用ulimit命令,把程序能够使用的内存稍稍调低一些,这样即使被占满,也不会被系统杀死:


ulimit -Sv 1600000

然后,使用 filprofiler 来运行这个程序:


fil-profile run test.py

运行效果如下图所示:

filprofiler 会在当前文件夹下面生成一个fil-result文件夹,在里面会有一个以时间命名的文件夹,文件夹中会有两个svg文件,如下图所示:

我们使用浏览器打开其中的out-of-memory.svg文件,可以看到如下图所示的内存占用图:

从图中可以看到,占用内存最大的函数是func_oom,程序也是在这个地方崩溃的。

目录
相关文章
|
5天前
|
存储 大数据 Unix
Python生成器 vs 迭代器:从内存到代码的深度解析
在Python中,处理大数据或无限序列时,迭代器与生成器可避免内存溢出。迭代器通过`__iter__`和`__next__`手动实现,控制灵活;生成器用`yield`自动实现,代码简洁、内存高效。生成器适合大文件读取、惰性计算等场景,是性能优化的关键工具。
72 2
|
1月前
|
传感器 数据采集 监控
Python生成器与迭代器:从内存优化到协程调度的深度实践
简介:本文深入解析Python迭代器与生成器的原理及应用,涵盖内存优化技巧、底层协议实现、生成器通信机制及异步编程场景。通过实例讲解如何高效处理大文件、构建数据流水线,并对比不同迭代方式的性能特点,助你编写低内存、高效率的Python代码。
115 0
|
4月前
|
人工智能 并行计算 开发者
CUDA重大更新:原生Python可直接编写高性能GPU程序
NVIDIA在2025年GTC大会上宣布CUDA并行计算平台正式支持原生Python编程,消除了Python开发者进入GPU加速领域的技术壁垒。这一突破通过重新设计CUDA开发模型,引入CUDA Core、cuPyNumeric、NVMath Python等核心组件,实现了Python与GPU加速的深度集成。开发者可直接用Python语法进行高性能并行计算,显著降低门槛,扩展CUDA生态,推动人工智能、科学计算等领域创新。此更新标志着CUDA向更包容的语言生态系统转型,未来还将支持Rust、Julia等语言。
369 3
CUDA重大更新:原生Python可直接编写高性能GPU程序
|
4月前
|
数据采集 运维 API
把Postman调试脚本秒变Python采集代码的三大技巧
本文介绍了如何借助 Postman 调试工具快速生成 Python 爬虫代码,并结合爬虫代理实现高效数据采集。文章通过“跨界混搭”结构,先讲解 Postman 的 API 调试功能,再映射到 Python 爬虫技术,重点分享三大技巧:利用 Postman 生成请求骨架、通过 Session 管理 Cookie 和 User-Agent,以及集成代理 IP 提升稳定性。以票务信息采集为例,展示完整实现流程,探讨其在抗封锁、团队协作等方面的价值,帮助开发者快速构建生产级爬虫代码。
157 1
把Postman调试脚本秒变Python采集代码的三大技巧
|
4月前
|
数据可视化 Linux iOS开发
Python测量CPU和内存使用率
这些示例帮助您了解如何在Python中测量CPU和内存使用率。根据需要,可以进一步完善这些示例,例如可视化结果或限制程序在特定范围内的资源占用。
185 22
|
10月前
|
机器学习/深度学习 数据挖掘 Python
Python编程入门——从零开始构建你的第一个程序
【10月更文挑战第39天】本文将带你走进Python的世界,通过简单易懂的语言和实际的代码示例,让你快速掌握Python的基础语法。无论你是编程新手还是想学习新语言的老手,这篇文章都能为你提供有价值的信息。我们将从变量、数据类型、控制结构等基本概念入手,逐步过渡到函数、模块等高级特性,最后通过一个综合示例来巩固所学知识。让我们一起开启Python编程之旅吧!
163 1
|
6月前
|
Python
[oeasy]python074_ai辅助编程_水果程序_fruits_apple_banana_加法_python之禅
本文回顾了从模块导入变量和函数的方法,并通过一个求和程序实例,讲解了Python中输入处理、类型转换及异常处理的应用。重点分析了“明了胜于晦涩”(Explicit is better than implicit)的Python之禅理念,强调代码应清晰明确。最后总结了加法运算程序的实现过程,并预告后续内容将深入探讨变量类型的隐式与显式问题。附有相关资源链接供进一步学习。
94 4
|
7月前
|
监控 Java 计算机视觉
Python图像处理中的内存泄漏问题:原因、检测与解决方案
在Python图像处理中,内存泄漏是常见问题,尤其在处理大图像时。本文探讨了内存泄漏的原因(如大图像数据、循环引用、外部库使用等),并介绍了检测工具(如memory_profiler、objgraph、tracemalloc)和解决方法(如显式释放资源、避免循环引用、选择良好内存管理的库)。通过具体代码示例,帮助开发者有效应对内存泄漏挑战。
347 1
|
8月前
|
存储 NoSQL 数据库连接
在Python程序中实现LevelDB的海量key的分批次扫描
通过本文的步骤,您可以在Python程序中实现对LevelDB海量key的分批次扫描。这样不仅能够有效地管理大规模数据,还可以避免一次性加载过多数据到内存中,提高程序的性能和稳定性。希望这篇指南能为您的开发工作提供实用的帮助。
197 28
|
9月前
|
安全 API C语言
Python程序的安全逆向(关于我的OPENAI的APIkey是如何被盗的)
本文介绍了如何使用C语言编写一个简单的文件加解密程序,并讨论了如何为编译后的软件添加图标。此外,文章还探讨了Python的.pyc、.pyd等文件的原理,以及如何生成和使用.pyd文件来增强代码的安全性。通过视频和教程,作者详细讲解了生成.pyd文件的过程,并分享了逆向分析.pyd文件的方法。最后,文章提到可以通过定制Python解释器来进一步保护源代码。
218 6

推荐镜像

更多