如何手动释放Python的内存

【Linux】python进程内存泄漏分析 python程序在重复执行同一个任务,一段时间后,通过top命令可以看到进程的“RES”内存在不断增长,由此可以判断发生了内存泄漏。 在Linux环境中,可以通过以下操作进行内存泄漏分析: (top命令中,使用 shift + f 可以选择排序列) # 1、(process status)打印每个用户进程状态,树状 ps auxf #2、(list open files)列出当前进程打开的文件 lsof -p {pid} #3、(strace)跟踪系统调用,进程执行到哪一步 strace -p {pid 阅读详情

在上篇博客中,提到了对一个脚本进行的多次优化。当时以为已经优化得差不多了,但是当测试人员测试时,我才发现,踩到了Python的一个大坑。

在上文的优化中,对每500个用户,会进行一些计算并记录结果在磁盘文件中。原本以为这么做,这些结果就在磁盘文件中了,而不会再继续占用内存;但实际上,Python的大坑就是Python不会自动清理这些内存。这是由其本身实现决定的。具体原因网上多有文章介绍,这里就不copy了。

本篇博客将贴一个笔者的实验脚本,用以说明Python确实存在这么一个不释放内存的现象,另外也提出一个解决方案,即:先del,再显式调用gc.collect(). 脚本和具体效果见下。


实验环境一:Win 7, Python 2.7

[python]  view plain  copy
  1. from time import sleep, time  
  2. import gc  
  3.   
  4. def mem(way=1):  
  5.     print time()  
  6.     for i in range(10000000):  
  7.         if way == 1:  
  8.             pass  
  9.         else:  # way 2, 3  
  10.             del i  
  11.               
  12.     print time()  
  13.     if way == 1 or way == 2:  
  14.         pass  
  15.     else:  # way 3  
  16.         gc.collect()  
  17.     print time()  
  18.           
  19. if __name__ == "__main__":  
  20.     print "Test way 1: just pass"  
  21.     mem(way=1)  
  22.     sleep(20)  
  23.     print "Test way 2: just del"  
  24.     mem(way=2)  
  25.     sleep(20)  
  26.     print "Test way 3: del, and then gc.collect()"  
  27.     mem(way=3)  
  28.     sleep(20)  
  29.       


运行结果如下:

[plain]  view plain  copy
  1. Test way 1: just pass  
  2. 1426688589.47  
  3. 1426688590.25  
  4. 1426688590.25  
  5. Test way 2: just del  
  6. 1426688610.25  
  7. 1426688611.05  
  8. 1426688611.05  
  9. Test way 3: del, and then gc.collect()  
  10. 1426688631.05  
  11. 1426688631.85  
  12. 1426688631.95  


对于way 1和way 2,结果是完全一样的,程序内存消耗峰值是326772KB,在sleep 20秒时,内存实时消耗是244820KB;

对于way 3,程序内存消耗峰值同上,但是sleep时内存实时消耗就只有6336KB了。


实验环境二: Ubuntu 14.10, Python 2.7.3


运行结果:

[plain]  view plain  copy
  1. Test way 1: just pass  
  2. 1426689577.46  
  3. 1426689579.41  
  4. 1426689579.41  
  5. Test way 2: just del  
  6. 1426689599.43  
  7. 1426689601.1  
  8. 1426689601.1  
  9. Test way 3: del, and then gc.collect()  
  10. 1426689621.12  
  11. 1426689622.8  
  12. 1426689623.11  

[plain]  view plain  copy
  1. ubuntu@my_machine:~$ ps -aux | grep test_mem  
  2. Warning: bad ps syntax, perhaps a bogus '-'? See http://procps.sf.net/faq.html  
  3. ubuntu    9122 10.0  6.0 270916 245564 pts/1   S+   14:39   0:03 python test_mem.py  
  4. ubuntu    9134  0.0  0.0   8104   924 pts/2    S+   14:40   0:00 grep --color=auto test_mem  
  5. ubuntu@my_machine:~$ ps -aux | grep test_mem  
  6. Warning: bad ps syntax, perhaps a bogus '-'? See http://procps.sf.net/faq.html  
  7. ubuntu    9122 10.0  6.0 270916 245564 pts/1   S+   14:39   0:03 python test_mem.py  
  8. ubuntu    9134  0.0  0.0   8104   924 pts/2    S+   14:40   0:00 grep --color=auto test_mem  
  9. ubuntu@my_machine:~$ ps -aux | grep test_mem  
  10. Warning: bad ps syntax, perhaps a bogus '-'? See http://procps.sf.net/faq.html  
  11. ubuntu    9122 11.6  0.1  30956  5608 pts/1    S+   14:39   0:05 python test_mem.py  

结论:

以上说明,当调用del时,其实Python并不会真正release内存,而是将其继续放在其内存池中;只有在显式调用gc.collect()时,才会真正release内存。


进一步:

其实回到上一篇博客的脚本中,也让其引入gc.collect(),然后写个监控脚本监测内存消耗情况:

[plain]  view plain  copy
  1. while ((1)); do ps -aux | sort -n -k5,6 | grep my_script; free; sleep 5; done  

结果发现:内存并不会在每500个用户一组执行完后恢复,而是一直持续消耗到仅存约70MB时,gc才好像起作用。本环境中,机器使用的是Cloud instance,总内存2G,可用内存约为1G,本脚本内存常用消耗是900M - 1G。换句话说,对于这个脚本来说,gc并没有立即起作用,而是在系统可用内存从1 - 1.2G下降到只剩70M左右时,gc才开始发挥作用。这点确实比较奇怪,不知道和该脚本是在Thread中使用的gc.collect()是否有关,或者是gc发挥作用原本就不是可控的。笔者尚未做相关实验,可能在下篇博客中继续探讨。

但是,可以肯定的是,若不使用gc.collect(), 原脚本将会将系统内存耗尽而被杀死。这一点从syslog中可以明显看出。





转载自:http://blog.youkuaiyun.com/nirendao/article/details/44426201/

独立站如何采集商品?外贸独立站采集教程 从这里Robert了解到还有国内有很多仿牌卖家、微商,都有类似的情况,他们出海的阻碍主要在于支付、物流、推广。8.插件“抓取任务”列表手动点同步,将商品同步到主商城后台商品管理列表(商品默认同步到下架列表中) 后台商品管理下架列表显示已同步商品。5.店铺信息修改完成后,可以开始采集商品,采集时弹窗中会自动识别当前平台及商品链接,分类和相册名称可以自定义 编辑修改。4. 打开采集目标站商品页面,点开谷歌浏览器扩展程序列表,找到Shopyy采集平台,打开配置页。打开弹窗中的“店铺管理”,添加店铺信息。 阅读详情

相关推荐

ENSP之配置静态路由

ENSP之配置静态路由 两台路由器两台PC 拓扑图如下: 配置AR1线路上的两条IP地址 配置AR2线路上的两条IP地址 3.AR2上 配置静态IP 路由 AR1上 配置静态IP 路由 设置两台PC 的IP地址 网关 PC1 PC2 全部配置好了之后 现在测试PC1是否ping 得通PC2 在命令行输入 成功的话如下图 ...

浪友与泪的博客 3544

如何释放Python占用的内存?Python内存释放方法总结

Python有自动垃圾回收机制,可以定期回收不再使用的对象所占用的内存。但是,如果对象之间存在循环引用,则需要手动断开循环来让垃圾回收机制回收内存。这里总结几种常用的Python内存释放方法。

devid008的博客 1万+

DGX Spark上PyTorch GPU环境配置实战:CUDA 13.0与ARM架构全流程

在深度学习中,CUDA作为GPU加速计算的底层基础,其版本与深度学习框架(如PyTorch)的匹配直接影响模型训练的效率与稳定性。GPU环境配置不仅涉及驱动、CUDA工具链与框架运行时的协同,还依赖于硬件架构与预构建包的兼容性。在AI开发机Ubuntu系统上,正确对齐CUDA版本、计算能力架构及安装源,是避免环境故障、发挥硬件算力的关键。无论是面向个人AI超算还是通用GPU服务器,掌握版本对齐、路径隔离与验证方法,都能大幅提升开发效率。本文以DGX Spark为例,详解从环境摸底到PyTorch GPU版本

weixin_29483277的博客 216

python 内存释放

python话说会自己管理内存,实际上,对于占用很大内存的对象,并不会马上释放。举例,a=range(10000*10000),会发现内存飙升一个多G,del a 或者a=[]都不能将内存降下来。。 del 可以删除多个变量,del a,b,c,d 办法: import gc (garbage collector) del a gc.collect() 马上内存就释放了。

fennvde007的专栏 3万+

微波射频学习笔记18-------偶极子天线和微波天线设计介绍

几种天线设计方法的介绍 一、偶极子天线 1.天线模型 两根紧挨着的金属导体,长度均为四分之一波长,直径均远小于波长,两导体间距也远小于波长。 2.天线性能的设计因素 ① 单个导体长度L:(光速/频率)/4=四分之一波长(在空气中传播的波长),但在导体中传播,波长会变短; ② 导体半径R:远小于波长即可,使用导电率高些的材料,市面上常见直径零点几毫米就挺好,或者用波长/200,得出一个小200的值,也算远小于波长; ③ 两导体间距S:远小于波长即可,可以比半径更小点。 以上三个变量L、R、S,均可在仿真软件

Sil_sprout 1万+

Open3D 计算点云法向量的夹角【2026最新版】

计算法向量的夹角,博客长期更新,本文最新更新时间为:2026年3月7日。

点云侠的博客 3129

Python的内存管理以及垃圾回收

参考:http://www.cnblogs.com/CBDoctor/p/3781078.html 先从较浅的层面来说,Python的内存管理机制可以从三个方面来讲 (1)垃圾回收 (2)引用计数 (3)内存池机制 一、垃圾回收: python不像C++,Java等语言一样,他们可以不用事先声明变量类型而直接对变量进行赋值。对Python语言来讲,对象的类型

Mr.Yan的专栏 2万+

OpenOCD入门到精通:第20章 Target 子系统源码分析

摘要:本章深入分析OpenOCD Target子系统的核心实现机制。重点包括:1) 通过target_type虚函数表实现多架构抽象,支持ARM、RISC-V等30+种目标;2) ARM ADIv5协议栈实现,包含DAP/AP核心数据结构和访问机制;3) 分层架构设计,从调试接口层到传输层的完整调用链路。系统采用面向对象思想,统一管理目标状态、寄存器缓存、断点/观察点等调试要素,为上层提供标准化的调试操作接口。

从事嵌入式linux android驱动开发,拥有全栈能力 176

python需要手动释放内存吗_谈谈如何手动释放Python的内存

在上篇博客中,提到了对一个脚本进行的多次优化。当时以为已经优化得差不多了,但是当测试人员测试时,我才发现,踩到了Python的一个大坑。在上文的优化中,对每500个用户,会进行一些计算并记录结果在磁盘文件中。原本以为这么做,这些结果就在磁盘文件中了,而不会再继续占用内存;但实际上,Python的大坑就是Python不会自动清理这些内存。这是由其本身实现决定的。具体原因网上多有文章介绍,这里就不co...

weixin_39851279的博客 296

【SpringBoot】1、创建第一个SpringBoot项目

创建SpringBoot项目可以通过两种方式,1、通过访问:https://start.spring.io/,SpringBoot的官方网站进行创建SpringBoot项目;2、通过工具(例如:Idea)创建SpringBoot项目。本次使用开发工具:Idea创建我的第一个SpringBoot项目。 首先,打开我们的Idea开发工具 选择Create New Poject(创建一个新的项目) ...

JACKAL 21万+

OpenHarmony AI系列:神经网络处理单元(NPU)驱动架构与实现详解

NPU(Neural Processing Unit,神经网络处理单元)是专门为神经网络计算设计的硬件加速器。在OpenHarmony系统中,NPU驱动是通过NNRT(Neural Network Runtime,神经网络运行时)框架实现的,它作为中间桥梁连接上层AI推理框架和底层NPU硬件,实现AI模型的跨芯片推理计算。

m0_67505153的博客 665

python 手动释放内存_Python手动清理内存

写程序这方面,自己不是科班出身,本科时唯一的C语言课也没有好好听讲。导致后来写代码的时候十分不规范,也缺失了许多细节,日常遇到的自己给自己挖的坑还是有必要记录一下,方便以后复盘。就像现在,前脚写完的代码后脚就忘了怎么写了……这段代码主要是处理了一下打文件读取过程中内存不够的问题,中间也对DataFrame进行了一系列操作,结果具体的操作怎么实现的自己已经不记得了……目前还没调试好。import p...

weixin_39559486的博客 2416

基于Simulink的PMSM轮毂电机崎岖路面悬架协同控制仿真

本文完成了基于Simulink的PMSM轮毂电机崎岖路面悬架协同控制仿真,实现了:✅ 构建了四轮独立驱动+主动悬架高保真整车模型✅ 实现了Skyhook主动悬架控制✅ 设计了驱动-悬架状态共享与协同决策机制✅ 验证了5 m/s高速下连续颠簸路面稳定通过能力✅ 为高性能移动机器人提供一体化底盘解决方案。

xiaoheshang_123的博客 189

Python手动释放内存的常用方法有哪些?

摘要:本文介绍了Python手动释放内存的常用方法,包括利用垃圾回收机制(gc模块)、内存管理工具(memory模块)、优化代码结构以及使用第三方库(如PyMem)。通过合理控制内存使用,开发者可以避免内存泄漏和资源浪费,提升程序性能与稳定性。文中还强调了在实施内存管理时需注意的关键点,如了解机制原理、监控内存使用及优化数据结构等。掌握这些方法有助于高效管理Python程序内存。

2501_90410679的博客 204

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

python内存怎么存方法_手动释放Python的内存的方法

在上文的优化中,对每500个用户,会进行一些计算并记录结果在磁盘文件中。原本以为这么做,这些结果就在磁盘文件中了,而不会再继续占用内存;但实际上,Python的大坑就是Python不会自动清理这些内存。这是由其本身实现决定的。具体原因网上多有文章介绍,这里就不copy了。本篇将贴一个笔者的实验脚本,用以说明Python确实存在这么一个不释放内存的现象,另外也提出一个解决方案,即:先del,再显式调...

weixin_32001433的博客 740

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

python需要手动释放内存吗_手动释放Python的内存的方法

在上文的优化中,对每500个用户,会进行一些计算并记录结果在磁盘文件中。原本以为这么做,这些结果就在磁盘文件中了,而不会再继续占用内存;但实际上,Python的大坑就是Python不会自动清理这些内存。这是由其本身实现决定的。具体原因网上多有文章介绍,这里就不copy了。本篇将贴一个笔者的实验脚本,用以说明Python确实存在这么一个不释放内存的现象,另外也提出一个解决方案,即:先del,再显式调...

weixin_39573781的博客 187

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

php手动释放内存,谈谈如何手动释放Python的内存

摘要:在上篇博客中,提到了对一个脚本进行的多次优化。当时以为已经优化得差不多了,但是当测试人员测试时,我才发现,踩到了Python的一个大坑。在上文的优化中,对每500个用户,会进行一些计算并记录结果在磁盘文件中。原本以为这么做,这些结果就在磁盘文件中了,而不会再继续占用内存;但实际上,Python的大坑就是Python不会自动清理这些内存。这是由其本身实现决定的。具体原因网上多有文章介绍,这里就...

weixin_39571749的博客 97

python需要手动释放内存吗,Python没有释放内存

I've been working with XML resources, and it seems that Python is issuing a weird behavior. I've tested both lxml library and xml.etree.ElementTree, both holding memory after it should be collected by...

weixin_35212670的博客 313

python可以用del释放资源_手动释放Python的内存的方法

在上文的优化中,对每500个用户,会进行一些计算并记录结果在磁盘文件中。原本以为这么做,这些结果就在磁盘文件中了,而不会再继续占用内存;但实际上,Python的大坑就是Python不会自动清理这些内存。这是由其本身实现决定的。具体原因网上多有文章介绍,这里就不copy了。本篇将贴一个笔者的实验脚本,用以说明Python确实存在这么一个不释放内存的现象,另外也提出一个解决方案,即:先del,再显式调...

weixin_39875842的博客 1558

python需要手动释放内存吗_Python没有释放内存

I've been working with XML resources, and it seems that Python is issuing a weird behavior. I've tested both lxml library and xml.etree.ElementTree, both holding memory after it should be collected by...

weixin_39788986的博客 491

python的类怎么释放_谈谈如何手动释放Python的内存

在上篇博客中,提到了对一个脚本进行的多次优化。当时以为已经优化得差不多了,但是当测试人员测试时,我才发现,踩到了Python的一个大坑。在上文的优化中,对每500个用户,会进行一些计算并记录结果在磁盘文件中。原本以为这么做,这些结果就在磁盘文件中了,而不会再继续占用内存;但实际上,Python的大坑就是Python不会自动清理这些内存。这是由其本身实现决定的。具体原因网上多有文章介绍,这里就不co...

weixin_39858298的博客 389
上一篇: python pandas (ix & iloc &loc) 的区别
下一篇: 使用python时注意的内存、缓存问题
banlucainiao
博客等级 码龄11年 319粉丝 31原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值