分享

[原创]使用meliae来做Python对象内存监测

 文档集成 2014-03-17

[原创]使用meliae来做Python对象内存监测
by AKara 2011-04-17 @ http://blog.csdn.net/akara @ akarachen(at)gmail.com @weibo.com/akaras


  对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.
  > 安装Cython-0.14.1: http://www.
  > 安装meliae-0.3.0: https:///meliae

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

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

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

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

  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可以做更多的事情(续上述代码段):

 

  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 可将对象关系网以图的形式可视化操作,就更好了:-)

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

  相关文章:

  <<Python内存泄漏查看器实现 >> by AKara
  http://blog.csdn.net/akara/archive/2010/04/26/5530878.aspx
 
  <<Lua内存泄漏查看器实现 >> by AKara
  http://blog.csdn.net/akara/archive/2010/04/15/5490633.aspx

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

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多