【笔记】Python进程使用内存后不释放

这篇博客探讨了在Python中进行大量文件IO操作时遇到的内存问题,特别是使用pandas.DataFrame导致的内存占用不释放。作者尝试了各种内存诊断工具如tracemalloc和objectgraph,并考虑了Glibc优化可能的影响。尽管代码中未发现明显的内存泄漏,但即便改用Python内置类型如list和dict,问题仍然存在。文章提出了通过进程内存隔离和管理来规避这个问题,即使用子进程处理数据,避免整体内存占用过高影响其他服务。解决方案虽繁琐,但在处理大数据时可能是必要的权宜之计。

使用python进行大量的文件IO读写,压缩,复制,数据操作过程中RES占用(0.2G-5G,Python的GC会频繁地malloc/free),发现RES内存不释放。

  1. 排查代码后,没有发现内存泄露的情况(实际上有泄露,但是修改代码后,依然没有解决本文的问题),GC也是默认开启的。
  2. 使用tracemalloc,objectgraph调试,Python对象的产生和释放并没有啥异常,我们使用的是大对象,应该也不会被Python缓存。
  3. 考虑到代码中使用pandas.DataFrame,Google发现类似的问题,还有issue,发现可能是Glibc优化问题。
  4. 将数据容器改为Python内置类型list,dict,我们使用简单的Python脚本,持续频繁进行大对象的生成和释放,发现还是有问题。实际调测中也发现,这个问题给人的整体感觉不是代码哪里有问题,而是哪里有人做了优化,但是Python的对象内存管理是基于引用计数的(refcnt为0直接decref回收),python内存池也没发现大内存驻留,操作系统brk和mmap也并没有不释放内存,只能是C库的问题了)。没法继续定位了,需要太多时间成本了。
  5. 那么我们在Python中如何手动分配释放内存?我们使用进程内存隔离的能力直接管理内存,父进程只负责进程池管理,子进程干完事情,直接退出,或过期重新拉起,或者超过内存阈值就干掉,就可以了。(虽然很麻烦,但是如果你需要大量的进程处理数据,每个进程的内存有很大数据吞吐量,那么整体过高的内存占用,会影响其他服务的服务能力)。

参考
MySQL 内存管理初探
glibc malloc常驻内存不释放问题抽象

### 笔记本电脑 CPU 使用率低但内存占用高的原因分析 笔记本电脑在运行过程中,可能会出现 CPU 使用率较低但物理内存占用较高的情况。这种现象通常由以下几个方面的原因引起: #### 1. 内存泄漏问题 某些应用程序或驱动程序可能存在内存泄漏的问题,导致它们断占用系统内存却无法释放。即使这些程序的 CPU 使用率很低,它们仍然会持续占用大量内存资源[^3]。 #### 2. 缓存和缓冲区占用 操作系统(如 Windows 或 Linux)为了提高文件读取速度,会将常用的数据缓存到内存中。如果系统检测到内存仍有空闲空间,它会尽可能多地使用内存来存储缓存数据,从而导致内存占用率较高。但实际上,这并一定意味着内存足,因为当需要更多内存时,操作系统可以快速释放这些缓存[^4]。 #### 3. 虚拟内存管理 如果硬盘上的虚拟内存文件(如 Windows 的 pagefile.sys)被频繁访问,可能会导致内存占用高,同时 CPU 使用率较低。这是因为虚拟内存的操作主要依赖于磁盘 I/O,而是直接消耗 CPU 资源[^5]。 #### 4. 数据库或服务器进程 一些后台运行的服务或数据库(如 MySQL、SQL Server)可能会长时间占用大量内存以存储索引、查询结果或其他中间数据。即使这些服务当前没有执行复杂操作,它们仍会保持较高的内存占用以备后续使用[^6]。 #### 5. 硬件或驱动问题 硬件故障或驱动程序异常也可能导致内存占用过高。例如,显卡驱动可能会分配过多的系统内存用于图形处理,或者某些硬件设备因错误配置而请求大量内存资源[^7]。 #### 6. 系统垃圾或临时文件 长时间运行的系统可能会积累大量的临时文件或缓存数据,这些数据可能占据大量内存。即使 CPU 活跃,内存占用仍然会保持高位[^8]。 ```python # 示例代码:检查内存使用情况(Python) import psutil def check_memory_usage(): memory = psutil.virtual_memory() print(f"Total Memory: {memory.total / (1024 ** 3):.2f} GB") print(f"Used Memory: {memory.used / (1024 ** 3):.2f} GB") print(f"Memory Percentage: {memory.percent}%") check_memory_usage() ``` ### 解决方法 - 检查是否有必要的后台程序正在运行,并关闭它们。 - 使用任务管理器或性能监控工具查看具体是哪些进程占用了大量内存。 - 更新系统和驱动程序以修复潜在的内存泄漏问题。 - 清理系统临时文件和缓存数据。 - 如果内存占用长期过高且影响性能,考虑升级物理内存
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值