2011-03-10 101 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