2011-03-01 31 views
8

我意识到在一个python脚本中存在内存泄漏。其中第一个大约占用了25MB,15天后超过了500MB。从调试器中打印python中的所有可用元组

我跟很多不同的方式,并不能进入问题的根源是作为一个python新手...

最后,我得到了这个以下

objgraph.show_most_common_types(limit=20) 
tuple      37674 
function     9156 
dict      3935 
list      1646 
wrapper_descriptor   1468 
weakref     888 
builtin_function_or_method 874 
classobj     684 
method_descriptor   551 
type      533 
instance     483 
Kind      470 
getset_descriptor   404 
ImmNodeSet     362 
module      342 
IdentitySetMulti   333 
PartRow     331 
member_descriptor   264 
cell      185 
FontEntry     170 

我设置断点点,并在每次迭代后,这是发生了什么...

objgraph.show_growth() 
tuple 37674  +10 

什么是继续进行的最好方法?

(Pdb) c 
(Pdb) objgraph.show_growth() 
tuple 37684  +10 

我猜打印所有元组和交叉检查 - 这是什么10元组被添加每次都会给我一些线索?请让我知道该怎么做..

或者有没有其他的方法来找出此内存泄漏。我使用的是Python 2.4.3,还有很多其他的产品依赖关系 - 不幸的是,我不能/不应该升级。

回答

2

我的阅读是否正确,相同的脚本运行了15天不间断?

对于这种长期运行的进程定期重启是一个很好的做法,它比消除所有的内存泄漏很容易做的。

更新:看this answer,似乎做你所需要的东西 - 打印收集,并非所有的垃圾新添加的对象。

0

我首先想到的是,也许你在你的脚本创建新的对象,并在某种全局列表的积累他们。查看脚本通常比较容易,并且确保不会生成任何持久数据,而不是调试垃圾。我认为你正在使用的实用程序objgraph也允许你打印带有引用数量的垃圾对象。你可以试试。

+0

它是一个非常庞大的脚本(超过3个模块),并且对python来说是新的,所以在通过整个脚本之后也无法找到。我仍然在寻找打印所有元组或至少打印全局元组的方式......但是还没有运气! – user379997