Python中使用MELIAE分析程序内存占用实例


Posted in Python onFebruary 18, 2015

写的dht协议搜索的程序,这几天优化了一下发现速度确实快了好多。但是出现了一个新的问题,内存直接飙升,我开了十个爬虫占用内存800m。开始我以为是节点太多了,找了几个小问题修改一下,发现没用。后来就到网上查找python内存分析的工具,查了一点资料发现python有个meliae库操作非常方便,就使用分析了一下,发现不是节点太多的原因0 0,是保存发送的t_id,用来标示返回的消息是那个发出的一个字典过大了。

从分析的结果非常容易的定位了某个对象的数量和大小,非常容易分析。我开始以为是因为好多发送查询信息以后,对面没返回造成这个字典里的元素没有释放造成的,我就用过期时间判断了一下,进行过期删除。发现是小了,但是不是非常显著,好像少了几十不到100M。后来又减少了查找一个随机hash的时间,以前是1分钟查一次,我改成了就第一次查!,发现没减少0 0.不知道是啥的原因。应该就是查找hash,询问节点,然后返回然后询问里边的节点,最后数量越来越多,但是我不明白的是,怎么会这么多运行一分钟就有60万条。也就是说当时内存没释放的对象就有这么多。达到这个内存占用后,基本就不再变化,有很小很慢的提升,因为还开的其他程序,不确定是不是这些程序其他对象的增加造成的。等分阶段dump测试一下。

安装直接pip install meliae 就ok了,我看好久没更新的项目了,不知道还有没有好的替代品不过用着还不错。

将内存dump到文件

 from meliae import scanner

 scanner.dump_all_objects('/tmp/dump%s.txt' % time.time())

分析文件:
 from meliae import loader

 #加载dump文件

 om = loader.load('/opt/log/dump.txt')

 #计算各Objects的引用关系

 om.compute_parents()

 #去掉各对象Instance的_dict_属性

 om.collapse_instance_dicts()

 #分析内存占用情况

 om.summarize()

字段意义如下:
Index : 行索引号
Count : 该类型的对象总数
%(Count) : 该类型的对象总数 占 所有类型的对象总数 的百分比
Size : 该类型的对象总字节数
%(Size) : 该类型的对象总字节数 占 所有类型的对象总字节数 的百分比
Cum : 累积行索引后的%(Size)
Max : 该类型的对象中,最大者的字节数
Kind : 类型

分析某个对象,找出它的引用关系

 #得到所有的POP3ClientProtocol对象

 p = om.get_all('POP3ClientProtocol')

 #查看第一个对象

 p[0]

 #可以查看该对象的所有引用

 p[0].c

 #查看谁引用了这个对象

 p[0].p
Python 相关文章推荐
python网络编程之TCP通信实例和socketserver框架使用例子
Apr 25 Python
用Python代码来绘制彭罗斯点阵的教程
Apr 03 Python
Django接受前端数据的几种方法总结
Nov 04 Python
Python队列的定义与使用方法示例
Jun 24 Python
python 换位密码算法的实例详解
Jul 19 Python
Python常用字符串替换函数strip、replace及sub用法示例
May 21 Python
Python爬虫之pandas基本安装与使用方法示例
Aug 08 Python
python实现合并两个排序的链表
Mar 03 Python
python自动发邮件总结及实例说明【推荐】
May 31 Python
Python实现微信翻译机器人的方法
Aug 13 Python
python orm 框架中sqlalchemy用法实例详解
Feb 02 Python
还在手动盖楼抽奖?教你用Python实现自动评论盖楼抽奖(一)
Jun 07 Python
Python中的__SLOTS__属性使用示例
Feb 18 #Python
Python contextlib模块使用示例
Feb 18 #Python
Python中使用Inotify监控文件实例
Feb 14 #Python
Python中实现的RC4算法
Feb 14 #Python
Python脚本实现网卡流量监控
Feb 14 #Python
Centos5.x下升级python到python2.7版本教程
Feb 14 #Python
Python脚本实现DNSPod DNS动态解析域名
Feb 14 #Python
You might like
PHP教程 预定义变量
2009/10/23 PHP
php获取flash尺寸详细数据的方法
2016/11/12 PHP
通过Javascript读取本地Excel文件内容的代码示例
2014/04/08 Javascript
IE6-8中Date不支持toISOString的修复方法
2014/05/04 Javascript
JS获取客户端IP地址、MAC和主机名的7个方法汇总
2014/07/21 Javascript
JavaScript分秒倒计时器实现方法
2015/02/02 Javascript
JavaScript中的setUTCDate()方法使用详解
2015/06/11 Javascript
ES6中如何使用Set和WeakSet
2016/03/10 Javascript
基于JS实现发送短信验证码后的倒计时功能(无视页面刷新,页面关闭不进行倒计时功能)
2016/09/02 Javascript
JS实现快速的导航下拉菜单动画效果附源码下载
2016/11/01 Javascript
jquery.Callbacks的实现详解
2016/11/30 Javascript
Node.js自定义实现文件路由功能
2017/09/22 Javascript
理解Koa2中的async&await的用法
2018/02/05 Javascript
不使用JavaScript实现菜单的打开和关闭效果demo
2018/05/01 Javascript
JS实现瀑布流效果
2020/03/07 Javascript
在Vue中使用antv的示例代码
2020/06/29 Javascript
Python内置函数 next的具体使用方法
2017/11/24 Python
python切片及sys.argv[]用法详解
2018/05/25 Python
python下载微信公众号相关文章
2019/02/26 Python
python读取.mat文件的数据及实例代码
2019/07/12 Python
浅谈keras保存模型中的save()和save_weights()区别
2020/05/21 Python
Python实现http接口自动化测试的示例代码
2020/10/09 Python
html5+css如何实现中间大两头小的轮播效果
2018/12/06 HTML / CSS
video下autoplay属性无效的解决方法(添加muted属性)
2020/05/19 HTML / CSS
html5实现九宫格抽奖可固定抽中某项奖品
2020/06/15 HTML / CSS
家乐福巴西网上超市:Carrefour巴西
2016/10/31 全球购物
澳大利亚领先的美容护肤品零售商之一:SkincareStore
2018/01/22 全球购物
什么是虚拟内存?虚拟内存有什么优势?
2016/02/09 面试题
通信工程毕业生自荐信
2013/11/01 职场文书
建筑施工员岗位职责
2013/11/26 职场文书
网上商城创业计划书范文
2014/01/31 职场文书
毕业生求职自荐书范文
2014/03/27 职场文书
教师节横幅标语
2014/10/08 职场文书
2015年幼儿园元旦亲子活动方案
2014/12/09 职场文书
委托书的样本
2015/01/28 职场文书
大学生个人简历自我评价
2015/03/11 职场文书