python程序内存分析_Python中使用MELIAE分析程序内存占用实例
写的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中使用MELIAE分析程序内存占用实例相关推荐
- python算法和数据结构_Python中的数据结构和算法
python算法和数据结构 To 至 Leonardo da Vinci 达芬奇(Leonardo da Vinci) 介绍 (Introduction) The purpose of this ar ...
- python如何做敏感度分析_Python中的模型敏感度分析(使用Salib)
敏感度分析的基础概念 文本主要参考了维基百科(对其中的关键部分进行了摘选了翻译):https://en.wikipedia.org/wiki/Sensitivity_analysisen.wikip ...
- python数据库模糊查询_python中数据库like模糊查询方式
python中数据库like模糊查询方式 在Python中%是一个格式化字符,所以如果需要使用%则需要写成%%. 将在Python中执行的sql语句改为: sql = "SELECT * F ...
- python怎么清理垃圾_Python 中的“垃圾”是怎么回收的?
前言 对于python来说,一切皆为对象,所有的变量赋值都遵循着对象引用机制.程序在运行的时候,需要在内存中开辟出一块空间,用于存放运行时产生的临时变量:计算完成后,再将结果输出到永久性存储器中.如果 ...
- python基础知识测试题_Python中的单元测试—基础知识
python基础知识测试题 Unit testing is the number one skill which separates people who just finished their de ...
- python计算平方面积_python中求平方
python学习(2)--变量与表达式 python学习(2)--变量与表达式 1.与java和c语言相通,python中也分为四种运算符: (1)算数运算符(如:+.-.*./); 学过java或者 ...
- python做大型网站_Python中的大型Web应用:一个好的架构
如果你着手使用关系型数据库在Python中编写大型应用程序,这篇长文正好满足你的需求.这里我分享下在一个大型团队中使用SQLAlchemy(Python语言中提供最先进ORM工具的软件)编写超过6个月 ...
- python元编程运用_Python 中的元编程
就像元数据是有关数据的数据一样,元编程就是编写用于操纵程序的某些程序.人们普遍认为,元程序就是生成其他程序的某些程序,但范式更加广泛.所有旨在自我读取.分析.转换或修改的程序都是元编程的范例.例如: ...
- python gevent模块 下载_Python中的多任务,并行,并发,多线程,多进程,协程区别...
多任务 CPU承担了所有的计算任务.一个CPU在一个时间切片里只能运行一个程序.当我们想同时运行多于一个程序的时候,就是多任务,例如同时运行微信,QQ,浏览器等等.多任务的目的是提升程序的执行效率,更 ...
- [转载] python处理数据列_Python中基于跨列的数据处理
参考链接: Python 克里斯蒂安Cristian算法 python处理数据列 Let's suppose your manager gives you a random dataset and t ...
最新文章
- python递归函数是指_python 函数递归作业求解析
- java笔试题_一个Java程序员在百度的笔试题整理
- php mysql_fetch_array mysql_fetch__php提示Warning:mysql_fetch_array() expects的解决方法
- AnimalTFDB 3.0 | 动物转录因子注释和预测的综合资源库
- 111_Power Pivot 24小时维度:累计、同比、环比相关
- Bootstrap3 面板的情景类
- 有没有妈妈生了孩子一点不像自己的,觉得亏吗?
- uartz Spring与Spring Task总结
- adroid intent使用
- Atitit 如何利用先有索引项进行查询性能优化
- 为什么浏览器要阻止跨域
- i5200u处理器 HD5500集成显卡安装黑苹果教程
- 二年级计算机学什么礼物,二年级的小朋友喜欢什么礼物(最美好的礼物二年级)...
- Qos报文分类和标记原理与实验
- Flutter技术与实战(4)
- 云服务器添加交换分区
- 2020年UI和UE的设计流行趋势揭秘!设计师最爱的是?
- BUUCTF:[SWPU2019]你有没有好好看网课?
- QQ在线状态-可以与我直接QQ交流
- 源码交易平台如何选择