我试图在python中配置我的项目,但是我的内存不足。
我的项目本身是内存密集型的,但是当在cProfile下运行时,即使是一半的运行也会因“MemoryError”而死亡。
进行较小的运行不是一个好的选择,因为我们怀疑运行时是超线性缩放,我们正在尝试发现哪些函数在大运行期间占主导地位。
为什么cProfile占用了这么多内存?我可以减少花费吗?这是正常的吗?
答案 0 :(得分:1)
已更新:由于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())