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 threading多线程编程实例
Sep 18 Python
Android模拟器无法启动,报错:Cannot set up guest memory ‘android_arm’ Invalid argument的解决方法
Jul 01 Python
Python中的变量和作用域详解
Jul 13 Python
Fabric 应用案例
Aug 28 Python
Python读写/追加excel文件Demo分享
May 03 Python
Python DataFrame.groupby()聚合函数,分组级运算
Sep 18 Python
python简单鼠标自动点击某区域的实例
Jun 25 Python
Python3内置模块之base64编解码方法详解
Jul 13 Python
python开发前景如何
Jun 11 Python
Pandas之缺失数据的实现
Jan 06 Python
Django与AJAX实现网页动态数据显示的示例代码
Feb 24 Python
一篇文章弄懂Python关键字、标识符和变量
Jul 15 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
造就帕卡马拉的帕卡斯是怎么被发现的
2021/03/03 咖啡文化
php安全配置 如何配置使其更安全
2011/12/16 PHP
基于simple_html_dom的使用小结
2013/07/01 PHP
php动态生成版权所有信息的方法
2015/03/24 PHP
PHP正则匹配反斜杠'\'和美元'$'的方法
2017/02/08 PHP
Laravel访问出错提示:`Warning: require(/vendor/autoload.php): failed to open stream: No such file or di解决方法
2019/04/02 PHP
十分钟打造AutoComplete自动完成效果代码
2009/12/26 Javascript
js给onclick赋值传参数的两种方法
2013/11/25 Javascript
jquery和javascript中如何将一元素的内容赋给另一元素
2014/01/09 Javascript
jQuery切换网页皮肤并保存到Cookie示例代码
2014/06/16 Javascript
jquery操作checked属性以及disabled属性的多种方法
2014/06/20 Javascript
轻松创建nodejs服务器(9):实现非阻塞操作
2014/12/18 NodeJs
跟我学习javascript的定时器
2015/11/19 Javascript
bootstrap中selectpicker下拉框使用方法实例
2018/03/22 Javascript
js事件on动态绑定数据,绑定多个事件的方法
2018/09/15 Javascript
JS实现马赛克图片效果完整示例
2019/04/13 Javascript
vuejs element table 表格添加行,修改,单独删除行,批量删除行操作
2020/07/18 Javascript
解决echarts echarts数据动态更新和dataZoom被重置问题
2020/07/20 Javascript
Python面向对象程序设计构造函数和析构函数用法分析
2019/04/12 Python
django 使用 PIL 压缩图片的例子
2019/08/16 Python
使用OpenCV实现仿射变换—缩放功能
2019/08/29 Python
Python使用Slider组件实现调整曲线参数功能示例
2019/09/06 Python
Python栈的实现方法示例【列表、单链表】
2020/02/22 Python
django实现将修改好的新模型写入数据库
2020/03/31 Python
django 模型中的计算字段实例
2020/05/19 Python
Spy++的使用方法及下载教程
2021/01/29 Python
英国羊皮鞋类领先品牌:Just Sheepskin
2019/12/12 全球购物
英国第一独立滑雪板商店:The Snowboard Asylum
2020/01/16 全球购物
医院护理人员的自我评价分享
2013/10/04 职场文书
信息管理专业推荐信
2013/10/29 职场文书
端午节活动总结
2014/08/26 职场文书
房地产销售经理岗位职责
2015/02/02 职场文书
平遥古城导游词
2015/02/03 职场文书
2015年中秋节活动总结
2015/03/23 职场文书
大国崛起英国观后感
2015/06/02 职场文书
Python获取江苏疫情实时数据及爬虫分析
2021/08/02 Python