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

(0)

相关推荐

  • 10种检测Python程序运行时间、CPU和内存占用的方法

    在运行复杂的Python程序时,执行时间会很长,这时也许想提高程序的执行效率.但该怎么做呢? 首先,要有个工具能够检测代码中的瓶颈,例如,找到哪一部分执行时间比较长.接着,就针对这一部分进行优化. 同时,还需要控制内存和CPU的使用,这样可以在另一方面优化代码. 因此,在这篇文章中我将介绍7个不同的Python工具,来检查代码中函数的执行时间以及内存和CPU的使用. 1. 使用装饰器来衡量函数执行时间 有一个简单方法,那就是定义一个装饰器来测量函数的执行时间,并输出结果: import time

  • 浅谈Python 对象内存占用

    一切皆是对象 在 Python 一切皆是对象,包括所有类型的常量与变量,整型,布尔型,甚至函数. 参见stackoverflow上的一个问题 Is everything an object in python like ruby 代码中即可以验证: # everythin in python is object def fuction(): return print isinstance(True, object) print isinstance(0, object) print isinst

  • 有关wxpython pyqt内存占用问题分析

    一直觉得wxpython占用内存比较多,在工作中写的一些小程序应用,一对比其它的小程序,发现内存相差确实有点大. 测试了下QT框架 复制代码 代码如下: import sys,timefrom PyQt4 import QtCore, QtGui#import wxif __name__ == "__main__":while True:time.sleep(1) 只载入了框架,内存占用就有明显差别.载入wx的时候一般在20M左右,我写的几个应用也差不多是这么多,所以占用内存多的主要是

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

    写的dht协议搜索的程序,这几天优化了一下发现速度确实快了好多.但是出现了一个新的问题,内存直接飙升,我开了十个爬虫占用内存800m.开始我以为是节点太多了,找了几个小问题修改一下,发现没用.后来就到网上查找python内存分析的工具,查了一点资料发现python有个meliae库操作非常方便,就使用分析了一下,发现不是节点太多的原因0 0,是保存发送的t_id,用来标示返回的消息是那个发出的一个字典过大了. 从分析的结果非常容易的定位了某个对象的数量和大小,非常容易分析.我开始以为是因为好多发

  • Python 如何查看程序内存占用情况

    目录 查看程序内存占用情况 python查看内存使用 查看程序内存占用情况 flyfish psutil 这里用在查看内存占用情况 memory_profiler输出每一行代码增减的内存 安装 pip install memory_profiler 代码 import numpy as np import os import psutil import gc from memory_profiler import profile @profile def test():     a=np.ful

  • python memory_profiler库生成器和迭代器内存占用的时间分析

    不进行计算时,生成器和list空间占用 import time from memory_profiler import profile @profile(precision=4) def list_fun(): start = time.time() total = ([i for i in range(5000000)]) print('iter_spend_time:',time.time()-start) @profile(precision=4) def gent_func(): gen

  • python中的变量如何开辟内存

    python下的变量 不需要预先声明变量的类型,变量的类型和值在赋值的那一刻被初始化(声明和定义的过程一起完成) 在python中, 每一个变量在内存中创建,我们可以通过变量来查看内存中的值 哈哈,这里是不是很熟悉,跟c中的指针一样啊(访问内存中的值) 首先大家需要了解一点:在python中: x =5之后,我们要了解它的过程:系统先是找了一块内存,将5存储了进去,紧接着x指向了当前的这块内存 预测1:python下的变量是一个指针 >>> x = 4 >>> y =

  • Python获取android设备cpu和内存占用情况

    功能:获取android设备中某一个app的cpu和内存 环境:python和adb 使用方法:使用adb连接android设备,打开将要测试的app,执行cpu/内存代码 cpu获取代码如下:(输入参数为脚本执行时间) # coding:utf-8 ''' 获取系统total cpu ''' import os, csv import time import csv import numpy as np from matplotlib import pyplot as plt cpu_list

  • Python中查看变量的类型内存地址所占字节的大小

    Python中查看变量的类型,内存地址,所占字节的大小 查看变量的类型 #利用内置type()函数 >>> nfc=["Packers","49"] >>> afc=["Ravens","48"] >>> combine=zip(nfc,afc) >>> type(combine) <class 'zip'> 查看变量的内存地址 #利用内置函数

  • Python中的单继承与多继承实例分析

    本文实例讲述了Python中的单继承与多继承.分享给大家供大家参考,具体如下: 单继承 一.介绍 Python 同样支持类的继承,如果一种语言不支持继承,类就没有什么意义.派生类的定义如下所示: class DerivedClassName(BaseClassName1): <statement-1> . . . <statement-N> 需要注意圆括号中基类的顺序,若是基类中有相同的方法名,而在子类使用时未指定,python从左至右搜索 即方法在子类中未找到时,从左到右查找基类

  • 对python中基于tcp协议的通信(数据传输)实例讲解

    阅读目录 tcp协议:流式协议(以数据流的形式通信传输).安全协议(收发信息都需收到确认信息才能完成收发,是一种双向通道的通信) tcp协议在OSI七层协议中属于传输层,它上承用户层的数据收发,下启网络层.数据链路层.物理层.可以说很多安全数据的传输通信都是基于tcp协议进行的. 为了让tcp通信更加方便需要引入一个socket模块(将网络层.数据链路层.物理层封装的模块),我们只要调用模块中的相关接口就能实现传输层下面的繁琐操作. 简单的tcp协议通信模板:(需要一个服务端和一个客户端) 服务

  • 基于python tkinter的点名小程序功能的实例代码

    代码如下所示: import datetime import json import os import random import tkinter as tk import openpyxl # 花名册文件名 excel_file_path = "花名册.xlsx"#需在当前目录创建对应花名册.xlsx # 工作表名 excel_sheet = "Sheet1" # 记录存储文件名 file_path = "name_record.json"

  • python中判断数字是否为质数的实例讲解

    在计算机程序中,算法是灵魂,是程序的精髓所在.程序执行效率的高低直接取决于算法的优劣,所以计算机算法是计算机课程必修课.算法可以快速计算出我们所需要的结果,例如判断质数,这是很基础的内容,具体如何操作呢?下面小编向大家演示在python如何判断数字是否为质数. 质数:一个大于1的自然数,除了1和它本身外,不能被其他自然数(质数)整除(2, 3, 5, 7等),换句话说就是该数除了1和它本身以外不再有其他的因数. 判断代码: def isprime(a): if isinstance(a,int)

随机推荐