2011-03-10 105 views
1

我试图在python中剖析我的项目,但我内存不足。cProfile占用大量内存

我的项目本身是相当内存密集型的,但在cProfile下运行时,即使是半尺寸运行也会因“MemoryError”而死亡。

做较小的运行并不是一个好的选择,因为我们怀疑运行时间是超线性缩放,我们试图发现哪些功能在大运行中占主导地位。

为什么cProfile需要这么多的内存?我可以减少它吗?这是正常的吗?

回答

1

已更新:由于cProfile内置于当前版本的Python(_lsprof扩展名)中,因此应使用主分配器。如果这不适用于您,Python 2.7.1有一个--with-valgrind编译器选项,导致它在运行时切换到使用malloc()。这很好,因为它避免了必须使用抑制文件。您可以构建一个仅用于分析的版本,然后在valgrind下运行您的Python应用程序,以查看分析器所做的所有分配以及使用自定义分配方案的任何C扩展。

(原来的答案的休息如下):

也许尝试,看看那里的分配会。如果你在你的代码中的地方,你可以定期dump出来的内存使用情况,您可以使用guppy查看分配:

import lxml.html 
from guppy import hpy 

hp = hpy() 
trees = {} 
for i in range(10): 
    # do something 
    trees[i] = lxml.html.fromstring("<html>") 
    print hp.heap() 

    # examine allocations for specific objects you suspect 
    print hp.iso(*trees.values()) 
+0

哎呀,更新修复一个错字。 – samplebias 2011-03-10 22:39:06

+0

我不需要记忆我自己的项目。团队中的其他人已经这样做了,我们做了很大的改进。孔布将看到cProfile?鉴于它是一个C模块,我倾向于不这样认为。我估计,对于我们来说内存不足,cProfile必须使用大约半个GB的数量级。 – 2011-03-10 22:45:07

+0

好的,我会相应地更新我的答案。 – samplebias 2011-03-10 22:55:04