1
我试图在python中剖析我的项目,但我内存不足。cProfile占用大量内存
我的项目本身是相当内存密集型的,但在cProfile下运行时,即使是半尺寸运行也会因“MemoryError”而死亡。
做较小的运行并不是一个好的选择,因为我们怀疑运行时间是超线性缩放,我们试图发现哪些功能在大运行中占主导地位。
为什么cProfile需要这么多的内存?我可以减少它吗?这是正常的吗?
我试图在python中剖析我的项目,但我内存不足。cProfile占用大量内存
我的项目本身是相当内存密集型的,但在cProfile下运行时,即使是半尺寸运行也会因“MemoryError”而死亡。
做较小的运行并不是一个好的选择,因为我们怀疑运行时间是超线性缩放,我们试图发现哪些功能在大运行中占主导地位。
为什么cProfile需要这么多的内存?我可以减少它吗?这是正常的吗?
已更新:由于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())
哎呀,更新修复一个错字。 – samplebias 2011-03-10 22:39:06
我不需要记忆我自己的项目。团队中的其他人已经这样做了,我们做了很大的改进。孔布将看到cProfile?鉴于它是一个C模块,我倾向于不这样认为。我估计,对于我们来说内存不足,cProfile必须使用大约半个GB的数量级。 – 2011-03-10 22:45:07
好的,我会相应地更新我的答案。 – samplebias 2011-03-10 22:55:04