使用meliae来做Python对象内存监测

对Python内存使用情况做详细的监测,可能是每个项目一直关注的问题。
  
  这里介绍一个开源的Python Lib:meliae 。
  
  meliae Lib的作用正如它的主模块代码注释:
  "A simple way to dump memory consumption of a running python program."
  
  meliae 的对象内存监测报表丰富度接近cProfile后的性能报表。值得参考。

---------------------------------------------------------------------
  安装步骤 
---------------------------------------------------------------------  

  显然meliae优先推荐>Python2.6(multiprocessing / [simple]json...),
  但也有dummy实现来向后兼容<Python2.6。
  现存游戏/应用来说,还是Python2.5居多,所以下面都针对Python2.5.4。
  
  步骤:
  > 安装Python2.5.4: http://www.python.org
  > 安装Cython-0.14.1: http://www.cython.org
  > 安装meliae-0.3.0: https://launchpad.net/meliae

---------------------------------------------------------------------
  文档和例子 
---------------------------------------------------------------------

  ...唔...
  meliae没有文档和例子。
  RTFC吧。

----------------------------------------------------------------------
  牛刀小试
---------------------------------------------------------------------

  先看看最简单的接口用法:

[python]  view plain copy
  1. # -*- coding: utf-8 -*-  
  2. from meliae import scannr  
  3. from meliae import loader  
  4. class AKara(object):  
  5.     def __init__(self):  
  6.         self.attr = "evil"  
  7. if __name__ == "__main__":  
  8.     # 生成玩家对象list  
  9.     players = [AKara() for i in xrange(10)]  
  10.       
  11.     # 用scanner来scan一次所有内存对象到文件  
  12.     mem_file = "AKara.mem"  
  13.     scanner.dump_all_objects(mem_file)  
  14.       
  15.     # 用loader加载mem_file  
  16.     obj_mgr = loader.load(mem_file, using_json=None,   
  17.         show_prog=False, collapse=True)  
  18.     #obj_mgr.remove_expensive_references()  
  19.       
  20.     # 取得对象统计摘要对象  
  21.     summarize = obj_mgr.summarize()  
  22.     # 打印摘要对象  
  23.     print "summarize:/n%s/n/n"%(summarize)  
 

 

---------------------------------------------------------------------
  运行结果 
---------------------------------------------------------------------

 

---------------------------------------------------------------------    
  字段意义解释 
---------------------------------------------------------------------
  
  上述首行指出:总共现存10401个object,44种type, 共使用0.9M内存。
  
  而报表字段由左列至右列意义如下:
  Index : 行索引号
  Count : 该类型的对象总数
  %(Count) : 该类型的对象总数 占 所有类型的对象总数 的百分比
  Size : 该类型的对象总字节数
  %(Size) : 该类型的对象总字节数 占 所有类型的对象总字节数 的百分比
  Cum : 累积行索引后的%(Size)
  Max : 该类型的对象中,最大者的字节数
  Kind : 类型
      
  是不是比较直观:-)
      
---------------------------------------------------------------------
  meliae.loader.ObjManager 
---------------------------------------------------------------------

  上面代码中loader.load(...)返回的obj_mgr类型是meliae.loader.ObjManager。
  基于obj_mgr可以做更多的事情(续上述代码段):

 

[python]  view plain copy
  1. # 接下来我们看看玩家们到底在哪  
  2. # btw: get_all函数是sort(size, len, num_parents)过的:  
  3. # 所以,最大size的会在第一个,很好,虽然本例用不到。  
  4. player_list = obj_mgr.get_all("AKara")  
  5. first_player = player_list[0]  
  6. # 打印list的address  
  7. print "players list address: %s"%(id(players))    
  8. # 打印类型  
  9. print "type(first_player): %s"%(type(first_player))  
  10. # 打印字符串描述  
  11. print "first_player.__repr__: %s"%(first_player)  
  12. # 打印父引用列表  
  13. print "first_player.p: %s"%(first_player.p)  
  14. # 打印子引用列表  
  15. print "first_player.c: %s"%(first_player.c)  
  16. # 打印父引用列表中的第一个mem obj  
  17. print "first_player.p[0]: %s"%(first_player.p[0])  
  18. # 打印json描述的父引用列表中的第一个mem obj  
  19. print "first_player.p[0].to_json(): %s"%(first_player.p[0].to_json())  
  20. # 打印它的子引用列表  
  21. print "first_player.p[0].c: %s"%(first_player.p[0].c)  
  22. # 打印父引用列表中的第一个mem obj的父引用列表  
  23. print "first_player.p[0].p: %s"%(first_player.p[0].p)  
  24. # 好了,这东西是个dict,refs_as_dict  
  25. print "first_player.p[0].p[0].refs_as_dict(): %s"%(/  
  26.     first_player.p[0].p[0].refs_as_dict())  


---------------------------------------------------------------------
  运行结果 
---------------------------------------------------------------------

  players list address: 12110024
  type(first_player): <type 'meliae._loader._MemObjectProxy'>
  first_player.__repr__: AKara(11506032 172B 3refs 1par)
  first_player.p: [list(12110024 100B 10refs 1par)]
  first_player.c: [str(11493952 28B 14par 'attr"'), 
    str(11493984 28B 14par 'evil"'), 
    type(11991696 440B 4refs 14par 'AKara')]
  first_player.p[0]: list(12110024 100B 10refs 1par)
  first_player.p[0].to_json(): {
    "address": 12110024, 
    "type": "list", 
    "size": 100, 
    "refs": [11506032, 12120752, 12120784, 12120816, 
        12120848, 12120880, 12120912, 12120944, 
        12120976, 12121008]}
  first_player.p[0].c: [AKara(12121008 172B 3refs 1par), 
    AKara(12120976 172B 3refs 1par), 
    AKara(12120944 172B 3refs 1par), 
    AKara(12120912 172B 3refs 1par), 
    AKara(12120880 172B 3refs 1par), 
    AKara(12120848 172B 3refs 1par), 
    AKara(12120816 172B 3refs 1par), 
    AKara(12120784 172B 3refs 1par), 
    AKara(12120752 172B 3refs 1par), 
    AKara(11506032 172B 3refs 1par)]
  first_player.p[0].p: [dict(11062560 524B 20refs 4par)]
  first_player.p[0].p[0].refs_as_dict(): {
    '__builtins__"': module(10952176 28B 1ref 11par '__builtin__'), 
    '__doc__"': None, 
     'players"': list(12110024 100B 10refs 1par), 
     'scanner"': module(11495632 28B 1refs 3par 'meliae.scanner'), 
    '__file__"': 'D:test_meliae.py"', 
    'mem_file"': 'AKara.mem"', 
    '__name__"': '__main__"', 
    'AKara"': type(11991696 440B 4refs 14par 'AKara'), 
    'i"': 9, 
    'loader"': module(11508784 28B 1refs 3par 'meliae.loader')}

---------------------------------------------------------------------

  如果 meliae 可将对象关系网以图的形式可视化操作,就更好了:-)

---------------------------------------------------------------------

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值