2016-12-06 49 views
7

我有幾個(幾乎十)Gb的內存由ipython內核。我認爲這是來自大型對象(矩陣,列表,numpy數組......),我可能在某些操作中產生了,現在我不再需要了。在ipython和jupyter中列出內存使用情況

我想列表中的所有我曾通過其內存佔用定義排序他們對象。有沒有簡單的方法來做到這一點?對於某些類型有nbytes方法,但不是所有...所以我正在尋找一種通用的方式來列出我所做的所有對象和它們的內存佔用情況。

+0

'import sys; (),key = lambda x:x [1],reverse = True)[(x,sys.getsizeof(x)) – Abdou

+0

[如何檢查iPython中對象的內存使用情況?](http://stackoverflow.com/questions/563840/how-can-i-check-the-memory-usage-of-objects-in -ipython) – amin

+1

不是重複的,他問如何找到他不知道名稱的對象。 @Abdou你應該給我一個答案。 –

回答

15

假設你正在使用ipythonjupyter,你需要做的工作一點點得到一個列表中的所有你已定義的對象的。這意味着要取得globals()中的所有內容,並過濾掉modulesbuiltins,ipython objects等對象。一旦確定擁有這些對象,就可以繼續使用sys.getsizeof來抓取它們的大小。這可以概括如下:

import sys 

# These are the usual ipython objects, including this one you are creating 
ipython_vars = ['In', 'Out', 'exit', 'quit', 'get_ipython', 'ipython_vars'] 

# Get a sorted list of the objects and their sizes 
sorted([(x, sys.getsizeof(globals().get(x))) for x in dir() if not x.startswith('_') and x not in sys.modules and x not in ipython_vars], key=lambda x: x[1], reverse=True) 

請記住,對於Python對象(那些python的內置函數創建),sys.getsizeof將是非常準確的。但是使用第三方庫創建的對象可能會有點不準確。此外,請注意,如果對象由垃圾回收器管理,sys.getsizeof會增加額外的垃圾回收器開銷。所以,有些事情可能看起來比實際情況重一點。

作爲一個附註,numpy.nbytes方法可能會有些誤導,因爲它不包含數組對象的非元素屬性使用的內存。

我希望這會有所幫助。