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更新列表的方法
Jul 28 Python
python算法表示概念扫盲教程
Apr 13 Python
Python2实现的LED大数字显示效果示例
Sep 04 Python
浅谈django orm 优化
Aug 18 Python
python xlwt如何设置单元格的自定义背景颜色
Sep 03 Python
pytorch:model.train和model.eval用法及区别详解
Feb 20 Python
基于Tensorflow一维卷积用法详解
May 22 Python
pytorch cuda上tensor的定义 以及减少cpu的操作详解
Jun 23 Python
python文件读取失败怎么处理
Jun 23 Python
Python约瑟夫生者死者小游戏实例讲解
Jan 04 Python
浅谈Selenium+Webdriver 常用的元素定位方式
Jan 13 Python
利用Python如何画一颗心、小人发射爱心
Feb 21 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
使用PHPMYADMIN操作mysql数据库添加新用户和数据库的方法
2010/04/02 PHP
Codeigniter+PHPExcel实现导出数据到Excel文件
2014/06/12 PHP
laravel入门知识点整理
2020/09/15 PHP
鼠标事件延时切换插件
2011/03/12 Javascript
JavaScript高级程序设计 阅读笔记(二十) js错误处理
2012/08/14 Javascript
Web跨浏览器进程通信(Web跨域)
2013/04/17 Javascript
js鼠标及对象坐标控制属性详细解析
2013/12/14 Javascript
js跨域访问示例(客户端/服务端)
2014/05/19 Javascript
利用jQuery实现可以编辑的表格
2014/05/26 Javascript
基于js实现投票的实例代码
2015/08/04 Javascript
ES6的新特性概览
2016/03/10 Javascript
AngularJS equal比较对象实例详解
2016/09/14 Javascript
BootstrapValidator不触发校验的实现代码
2016/09/28 Javascript
self.attachevent is not a function的解决方法
2017/04/04 Javascript
Vue.js中数据绑定的语法教程
2017/06/02 Javascript
React实现全局组件的Toast轻提示效果
2018/09/21 Javascript
ionic4+angular7+cordova上传图片功能的实例代码
2019/06/19 Javascript
Vue 刷新当前路由的实现代码
2019/09/26 Javascript
vue实现购物车的监听
2020/04/20 Javascript
Vue 数据响应式相关总结
2021/01/28 Vue.js
Python中的filter()函数的用法
2015/04/27 Python
Python变量作用范围实例分析
2015/07/07 Python
整理Python 常用string函数(收藏)
2016/05/30 Python
详解python里使用正则表达式的分组命名方式
2017/10/24 Python
浅谈Python Opencv中gamma变换的使用详解
2018/04/02 Python
python 定义给定初值或长度的list方法
2018/06/23 Python
Python中GeoJson和bokeh-1的使用讲解
2019/01/03 Python
Pytorch实现基于CharRNN的文本分类与生成示例
2020/01/08 Python
HTML5中div、article、section的区别及使用介绍
2013/08/14 HTML / CSS
html5响应式开发自动计算fontSize的方法
2020/01/13 HTML / CSS
手工制作的音乐盒:Music Box Attic
2019/09/05 全球购物
类如何去实现接口
2013/12/19 面试题
介绍一下SQL Server里面的索引视图
2016/07/31 面试题
银行纠风工作实施方案
2014/06/08 职场文书
高中生学习计划书
2014/09/15 职场文书
详细了解MVC+proxy
2021/07/09 Java/Android