Python中使用MELIAE分析程序内存占用实例

作者:junjie 时间:2021-10-26 22:34:24 

写的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,MELIAE,分析,内存占用
0
投稿

猜你喜欢

  • python实现给scatter设置颜色渐变条colorbar的方法

    2021-04-06 11:46:44
  • 详解Django中的权限和组以及消息

    2022-08-03 16:13:14
  • Python使用dict.fromkeys()快速生成一个字典示例

    2022-05-10 08:13:23
  • Python实现问题回答小游戏

    2023-05-13 13:26:19
  • Oracle 数据库导出(exp)导入(imp)说明

    2009-03-06 10:49:00
  • ORACLE数据库空间整理心得

    2010-07-16 13:33:00
  • python模拟哔哩哔哩滑块登入验证的实现

    2021-05-01 22:23:40
  • 谈一谈bootstrap响应式布局

    2023-08-22 20:17:39
  • Python中filter与lambda的结合使用详解

    2022-03-03 01:35:03
  • 解密CSS Sprites:技巧、工具和教程

    2011-01-11 19:38:00
  • PyTorch CNN实战之MNIST手写数字识别示例

    2021-09-06 15:20:21
  • 实例演练ASP+XML编程

    2007-10-11 13:53:00
  • Python中getattr函数和hasattr函数作用详解

    2022-10-29 15:42:11
  • PHP中文件读、写、删的操作(PHP中对文件和目录操作)

    2023-11-22 06:03:23
  • Python线性回归实战分析

    2023-05-19 04:35:42
  • 利用python模拟实现POST请求提交图片的方法

    2021-02-20 05:58:21
  • XHTML1.0规范:您是否为img图片标签赋予alt属性

    2009-09-21 11:11:00
  • 在Django model中设置多个字段联合唯一约束的实例

    2021-02-09 22:04:59
  • Pytest mark使用实例及原理解析

    2021-02-27 14:30:11
  • python格式化字符串的实战教程(使用占位符、format方法)

    2023-02-01 22:20:21
  • asp之家 网络编程 m.aspxhome.com