2013-07-02 78 views
6

我有興趣瞭解大對象加載時python堆的總大小的增加。 heapy似乎是我需要的,但我不明白結果。在加載大對象後測量堆大小的增加

我有一個350 MB的泡菜文件,裏面有一個熊貓DataFrame,其中包含大約250萬個條目。當我加載文件並在之後檢查heapy堆時,它會報告堆中只添加了大約8 MB的對象。

import guppy 
h = guppy.hpy() 
h.setrelheap() 
df = pickle.load(open('test-df.pickle')) 
h.heap() 

這給出了以下的輸出:

Partition of a set of 95278 objects. Total size = 8694448 bytes. 
Index Count %  Size % Cumulative % Kind (class/dict of class) 
    0 44700 47 4445944 51 4445944 51 str 
    1 25595 27 1056560 12 5502504 63 tuple 
    2 6935 7 499320 6 6001824 69 types.CodeType 
... 

什麼混淆我是8694448 bytesTotal size。這只是8 MB。

爲什麼沒有Total size反映整個尺寸DataFramedf

(使用Python 2.7.3,heapy 0.1.10,Linux的3.2.0-48 - 仿製PAE(Ubuntu的),爲i686)

回答

0

你可以嘗試pympler,這爲我工作的我最後一次檢查。如果您只是對總內存增加感興趣,而不是針對特定類,則可以通過操作系統特定的調用來獲取所使用的總內存。例如,在基於Unix的操作系統上,可以在加載對象之前和之後執行類似下面的操作來獲取diff。

resource.getrusage(resource.RUSAGE_SELF).ru_maxrss 
+0

感謝您的回答。我還沒有開始嘗試使用益普樂 - 在接下來的幾天內會試用它。操作系統對內存消耗的看法並不是我所感興趣的,所以getrusage()對我來說無濟於事。 – rodion

0

我有一個類似的問題,當我試圖找出爲什麼我的500 MB CSV文件在內存中佔用高達5 GB。熊貓基本上建立在Numpy之上,因此使用C malloc來分配空間。這就是爲什麼它不能在heapy中顯示,它只能描述純Python對象。一種解決方案可能是查看valgrind來追蹤你的內存泄漏。