回复:如何调试内存使用情况?

5月6日,上午6:27,大卫 您需要使用Python的调试构建来获取确切的数字,
但是您可以在标准构建中使用一些技巧
检测内存泄漏.最简单的是简单地观看
RSS列输出`ps aux'(我假设您正在使用unix).
我从Chris Siebenmann http://utcc.utoronto.ca/~cks/space/b.../getallobjects获得的另一个技巧
我修改了他的例子.这不会告诉你如何
您的运行代码正在使用的许多内存字节,但它将
向您展示对象的数量.在寻找内存泄漏时,
计算物体数量足以检测泄漏.
例如,假设您怀疑一个功能正在泄漏内存.
您可以将其称为这样的循环,并观看
每次通话之前和之后的对象.
而真:
打印"数字对象:",len(get_all_objects())
suspect_function()
打印"数字对象:",len(get_all_objects())
这是我修改的Chris get_all_object()函数的修改版.
我所做的就是使用gc.collect()强制垃圾收集.
这确保您不计算Python拥有的对象
留在记忆中,但计划在某个时候删除.
导入GC
#递归扩展SLIST的对象
#进入olist,使用可见的跟踪
#已经处理过的对象.
def _getr(slist,olist,看到):
对于e slist:
如果ID(e)在看到:
继续
看到[id(e)] =无
olist.Append(E)
tl = gc.get_referents(e)
如果TL:
_getr(tl,olist,看到)
#公共功能.
def get_all_objects():
"""返回所有现场python对象的列表,不包括
列出本身."""
gc.collect()
gcl = gc.get_objects()
olist = []
SEED = {}
# 以防万一:
看到[id(gcl)] =无
看到[id(olist)] =无
看到[id(Seece)] =无
#_getr做真实的工作.
_getr(gcl,olist,看到)
返回olist
- -
诺亚

# 回答1


>
感谢您的逻辑.
我想调试rdiff -backup(Linux的Python备份工具) -
在工作中使用2 GB的内存(1GB RAM,1GB交换).
我将使用您的方法来找出为什么会发生这种情况.即使是
没有给我确切的详细信息,应该足够的信息可以通过.
大卫
# 回答2


5月6日,下午2:19,大卫 rsync使用很多内存:http://www.samba.org/rsync/faq.html#4
rdiff-backup使用liblsync,而不是rsync.
我不确定Rsync是否使用liblsync,但可以推测
他们共享一些代码,也许还有一些相同的问题.
但是,除非您要处理数百万个文件,否则2GB似乎过多.
内存泄漏似乎更有可能.
- -
诺亚
# 回答3


Rsync使用很多内存:
感谢您的输入.如果您感兴趣的话,这是我的链接
发布到本地Linux用户组:http://lists.clug.org.za/pipermail/c...Ay/040532.html
大卫.

标签: python

添加新评论