写的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分析程序内存占用实例相关推荐

  1. python算法和数据结构_Python中的数据结构和算法

    python算法和数据结构 To 至 Leonardo da Vinci 达芬奇(Leonardo da Vinci) 介绍 (Introduction) The purpose of this ar ...

  2. python如何做敏感度分析_Python中的模型敏感度分析(使用Salib)

    敏感度分析的基础概念 文本主要参考了维基百科(对其中的关键部分进行了摘选了翻译):https://en.wikipedia.org/wiki/Sensitivity_analysis​en.wikip ...

  3. python数据库模糊查询_python中数据库like模糊查询方式

    python中数据库like模糊查询方式 在Python中%是一个格式化字符,所以如果需要使用%则需要写成%%. 将在Python中执行的sql语句改为: sql = "SELECT * F ...

  4. python怎么清理垃圾_Python 中的“垃圾”是怎么回收的?

    前言 对于python来说,一切皆为对象,所有的变量赋值都遵循着对象引用机制.程序在运行的时候,需要在内存中开辟出一块空间,用于存放运行时产生的临时变量:计算完成后,再将结果输出到永久性存储器中.如果 ...

  5. python基础知识测试题_Python中的单元测试—基础知识

    python基础知识测试题 Unit testing is the number one skill which separates people who just finished their de ...

  6. python计算平方面积_python中求平方

    python学习(2)--变量与表达式 python学习(2)--变量与表达式 1.与java和c语言相通,python中也分为四种运算符: (1)算数运算符(如:+.-.*./); 学过java或者 ...

  7. python做大型网站_Python中的大型Web应用:一个好的架构

    如果你着手使用关系型数据库在Python中编写大型应用程序,这篇长文正好满足你的需求.这里我分享下在一个大型团队中使用SQLAlchemy(Python语言中提供最先进ORM工具的软件)编写超过6个月 ...

  8. python元编程运用_Python 中的元编程

    就像元数据是有关数据的数据一样,元编程就是编写用于操纵程序的某些程序.人们普遍认为,元程序就是生成其他程序的某些程序,但范式更加广泛.所有旨在自我读取.分析.转换或修改的程序都是元编程的范例.例如: ...

  9. python gevent模块 下载_Python中的多任务,并行,并发,多线程,多进程,协程区别...

    多任务 CPU承担了所有的计算任务.一个CPU在一个时间切片里只能运行一个程序.当我们想同时运行多于一个程序的时候,就是多任务,例如同时运行微信,QQ,浏览器等等.多任务的目的是提升程序的执行效率,更 ...

  10. [转载] python处理数据列_Python中基于跨列的数据处理

    参考链接: Python 克里斯蒂安Cristian算法 python处理数据列 Let's suppose your manager gives you a random dataset and t ...

最新文章

  1. python递归函数是指_python 函数递归作业求解析
  2. java笔试题_一个Java程序员在百度的笔试题整理
  3. php mysql_fetch_array mysql_fetch__php提示Warning:mysql_fetch_array() expects的解决方法
  4. AnimalTFDB 3.0 | 动物转录因子注释和预测的综合资源库
  5. 111_Power Pivot 24小时维度:累计、同比、环比相关
  6. Bootstrap3 面板的情景类
  7. 有没有妈妈生了孩子一点不像自己的,觉得亏吗?
  8. uartz Spring与Spring Task总结
  9. adroid intent使用
  10. Atitit 如何利用先有索引项进行查询性能优化
  11. 为什么浏览器要阻止跨域
  12. i5200u处理器 HD5500集成显卡安装黑苹果教程
  13. 二年级计算机学什么礼物,二年级的小朋友喜欢什么礼物(最美好的礼物二年级)...
  14. Qos报文分类和标记原理与实验
  15. Flutter技术与实战(4)
  16. 云服务器添加交换分区
  17. 2020年UI和UE的设计流行趋势揭秘!设计师最爱的是?
  18. BUUCTF:[SWPU2019]你有没有好好看网课?
  19. QQ在线状态-可以与我直接QQ交流
  20. 源码交易平台如何选择

热门文章

  1. Ubuntu平台采用Qemu搭建ARM虚拟机环境
  2. Snmp4j编程简介之一
  3. Linux 2.6 中的页面回收与反向映射
  4. linux 内核 内存管理 初始化 页表
  5. 买菜201809-2
  6. 打开html文件显示undefined,undefined是什么?电脑网页出现undefined时如何解决?
  7. python论文题目_有关利用python获取网页, 以及KDD近几年论文标题与摘要链接
  8. 严蔚敏数据结构之线性表的基本操作
  9. 4204. 构造矩阵
  10. 用概率的方法计算Pi值