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从网络读取图片并直接进行处理的方法
May 22 Python
windows上安装Anaconda和python的教程详解
Mar 28 Python
用python的requests第三方模块抓取王者荣耀所有英雄的皮肤实例
Dec 14 Python
python实现识别手写数字 python图像识别算法
Mar 23 Python
PyTorch快速搭建神经网络及其保存提取方法详解
Apr 28 Python
python MNIST手写识别数据调用API的方法
Aug 08 Python
pycharm: 恢复(reset) 误删文件的方法
Oct 22 Python
Python with用法:自动关闭文件进程
Jul 10 Python
双向RNN:bidirectional_dynamic_rnn()函数的使用详解
Jan 20 Python
在Matplotlib图中插入LaTex公式实例
Apr 17 Python
详解Python IO编程
Jul 24 Python
python 管理系统实现mysql交互的示例代码
Dec 06 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生成HTML静态页面实例代码
2008/08/31 PHP
php 如何获取数组第一个值
2013/08/06 PHP
YII模块实现绑定二级域名的方法
2014/07/09 PHP
php中运用http调用的GET和POST方法示例
2014/09/29 PHP
PHP实现的一致性哈希算法完整实例
2015/11/14 PHP
php给数组赋值的实例方法
2019/09/26 PHP
jquery select选中的一个小问题
2009/10/11 Javascript
使用JavaScript动态设置样式实现代码(2)
2013/01/25 Javascript
jQuery实现下拉框左右选择的简单实例
2014/02/22 Javascript
JavaScript使用push方法添加一个元素到数组末尾用法实例
2015/04/06 Javascript
Javascript刷新窗口方法小结
2015/10/21 Javascript
jQuery form插件之ajaxForm()和ajaxSubmit()的可选参数项对象
2016/01/23 Javascript
bootstrap fileinput 插件使用项目总结(经验)
2017/02/22 Javascript
python逆向入门教程
2018/01/15 Python
Python3处理HTTP请求的实例
2018/05/10 Python
influx+grafana自定义python采集数据和一些坑的总结
2018/09/17 Python
python实现两张图片的像素融合
2019/02/23 Python
python selenium firefox使用详解
2019/02/26 Python
Python爬取数据保存为Json格式的代码示例
2019/04/09 Python
使用python和pygame制作挡板弹球游戏
2019/12/03 Python
Django配置文件代码说明
2019/12/04 Python
如何利用pygame实现简单的五子棋游戏
2019/12/29 Python
详解python itertools功能
2020/02/07 Python
PySide2出现“ImportError: DLL load failed: 找不到指定的模块”的问题及解决方法
2020/06/10 Python
python subprocess pipe 实时输出日志的操作
2020/12/05 Python
html5 svg 中元素点击事件添加方法
2013/01/16 HTML / CSS
Cecil Mode法国在线商店:女性时尚
2021/01/08 全球购物
数据库专业英语
2012/11/30 面试题
银行柜员应聘推荐信范文
2013/11/24 职场文书
骨干教师培训制度
2014/01/13 职场文书
项目施工员岗位职责
2014/03/09 职场文书
成龙霸王洗发水广告词
2014/03/14 职场文书
党的群众路线教育实践活动动员会主持词
2014/03/20 职场文书
设计大赛策划方案
2014/06/13 职场文书
中小学生学籍证明
2014/10/25 职场文书
2015年共青团工作总结
2015/05/15 职场文书