您的位置:首页 > 编程语言 > Python开发

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

2015-06-19 16:17 711 查看
对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 plaincopy# -*- coding: utf-8 -*-
from meliae import scannr
from meliae import loader
class AKara(object):
def __init__(self):
self.attr = "evil"
if __name__ == "__main__":
# 生成玩家对象list
players = [AKara() for i in xrange(10)]

# 用scanner来scan一次所有内存对象到文件
mem_file = "AKara.mem"
scanner.dump_all_objects(mem_file)

# 用loader加载mem_file
obj_mgr = loader.load(mem_file, using_json=None,
show_prog=False, collapse=True)
#obj_mgr.remove_expensive_references()

# 取得对象统计摘要对象
summarize = obj_mgr.summarize()
# 打印摘要对象
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 plaincopy# 接下来我们看看玩家们到底在哪
# btw: get_all函数是sort(size, len, num_parents)过的:
# 所以,最大size的会在第一个,很好,虽然本例用不到。
player_list = obj_mgr.get_all("AKara")
first_player = player_list[0]
# 打印list的address
print "players list address: %s"%(id(players))
# 打印类型
print "type(first_player): %s"%(type(first_player))
# 打印字符串描述
print "first_player.__repr__: %s"%(first_player)
# 打印父引用列表
print "first_player.p: %s"%(first_player.p)
# 打印子引用列表
print "first_player.c: %s"%(first_player.c)
# 打印父引用列表中的第一个mem obj
print "first_player.p[0]: %s"%(first_player.p[0])
# 打印json描述的父引用列表中的第一个mem obj
print "first_player.p[0].to_json(): %s"%(first_player.p[0].to_json())
# 打印它的子引用列表
print "first_player.p[0].c: %s"%(first_player.p[0].c)
# 打印父引用列表中的第一个mem obj的父引用列表
print "first_player.p[0].p: %s"%(first_player.p[0].p)
# 好了,这东西是个dict,refs_as_dict
print "first_player.p[0].p[0].refs_as_dict(): %s"%(/
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 可将对象关系网以图的形式可视化操作,就更好了:-)

---------------------------------------------------------------------
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: