我正在尝试在 python 中分析我的项目,但内存不足。
我的项目本身相当占用内存,但在 cProfile 下运行时,即使是一半大小的运行也会因“MemoryError”而死。
进行较小的运行不是一个好的选择,因为我们怀疑运行时间是超线性缩放的,并且我们正试图发现哪些函数在大型运行中占主导地位。
为什么 cProfile 占用这么多内存?我可以减少它吗?这是正常的吗?
更新:由于 cProfile 内置于当前版本的 Python(_lsprof 扩展)中,它应该使用主分配器。如果这对你不起作用,Python 2.7.1 有一个--with-valgrind
编译器选项,它会导致它在运行时切换到使用malloc()
。这很好,因为它避免了使用抑制文件。您可以构建一个仅用于分析的版本,然后在 valgrind 下运行您的 Python 应用程序以查看分析器所做的所有分配以及使用自定义分配方案的任何 C 扩展。
(原始答案的其余部分如下):
也许试着看看分配的去向。如果您的代码中有一个地方可以定期转储内存使用情况,您可以使用它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())