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使用递归解决全排列数字示例
Feb 11 Python
Python创建系统目录的方法
Mar 11 Python
深入讲解Java编程中类的生命周期
Feb 05 Python
python实现简单购物商城
May 21 Python
pandas.DataFrame.to_json按行转json的方法
Jun 05 Python
python脚本监控Tomcat服务器的方法
Jul 06 Python
python 循环读取txt文档 并转换成csv的方法
Oct 26 Python
利用python将图片版PDF转文字版PDF
May 03 Python
对python3中的RE(正则表达式)-详细总结
Jul 23 Python
Python如何使用Gitlab API实现批量的合并分支
Nov 27 Python
如何利用pygame实现简单的五子棋游戏
Dec 29 Python
python 机器学习的标准化、归一化、正则化、离散化和白化
Apr 16 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使用file_get_content设置头信息的方法
2016/02/14 PHP
PHP命名空间namespace及use的简单用法分析
2018/08/03 PHP
Windows平台PHP+IECapt实现网页批量截图并创建缩略图功能详解
2019/08/02 PHP
Laravel jwt 多表(多用户端)验证隔离的实现
2019/12/18 PHP
js 实现无干扰阴影效果 简单好用(附文件下载)
2009/12/27 Javascript
第一个JavaScript入门基础 document.write输出
2010/02/22 Javascript
jQuery快速上手:写jQuery与直接写JS的区别详细解析
2013/08/26 Javascript
jquerymobile局部渲染的各种刷新方法小结
2014/03/05 Javascript
使用jQuery动态加载js脚本文件的方法
2014/04/03 Javascript
javascript trim函数在IE下不能用的解决方法
2014/09/12 Javascript
JS实现的计数排序与基数排序算法示例
2017/12/04 Javascript
JS实现把一个页面层数据传递到另一个页面的两种方式
2018/08/13 Javascript
微信小程序自定义组件封装及父子间组件传值的方法
2018/08/28 Javascript
在vue项目中集成graphql(vue-ApolloClient)
2018/09/08 Javascript
vue组件中iview的modal组件爬坑问题之modal的显示与否应该是使用v-show
2019/04/12 Javascript
Vue CLI2升级至Vue CLI3的方法步骤
2019/05/20 Javascript
详解在React-Native中持久化redux数据
2019/05/22 Javascript
vue如何实现动态加载脚本
2020/02/05 Javascript
js根据后缀判断文件文件类型的代码
2020/05/09 Javascript
[01:38:19]夜魇凡尔赛茶话会 第五期
2021/03/11 DOTA
Python正则表达式的使用范例详解
2014/08/08 Python
对python使用http、https代理的实例讲解
2018/05/07 Python
python3中os.path模块下常用的用法总结【推荐】
2018/09/16 Python
一个可以套路别人的python小程序实例代码
2019/04/09 Python
在PyCharm的 Terminal(终端)切换Python版本的方法
2019/08/02 Python
教你如何一步一步用Canvas写一个贪吃蛇
2018/10/22 HTML / CSS
泰国在线书店:SE-ED
2020/06/21 全球购物
24岁生日感言
2014/01/13 职场文书
幼儿园中班新学期寄语
2014/01/18 职场文书
《少年王勃》教学反思
2014/04/27 职场文书
兴趣小组活动总结
2014/05/05 职场文书
户籍证明模板
2014/09/28 职场文书
2015年党员承诺书
2015/01/21 职场文书
2015年效能监察工作总结
2015/04/23 职场文书
领导干部失职检讨书
2015/05/05 职场文书
2016年共产党员公开承诺书
2016/03/24 职场文书