2015-09-20 24 views
2

我的代碼在具有100GB內存的羣集節點上的CentOS 6.6上運行。但是,這似乎仍然不夠大,因爲我的代碼需要讀取1000個以上的hickle文件(每個200MB)。這完全是240GB。代碼運行時,系統內存高速緩存不斷增加,直到完成,並且在分配新對象和進行numpy數組計算時,代碼性能變得非常慢。在讀取大量文件或lmdb時禁用python文件緩存

我試圖做GC.Collect的德爾,以防止任何內存泄露,但記憶還在不斷增加。我懷疑這是由於文件緩存。所以我想知道在python sys或os lib中是否有一個函數可以在讀取大量(每個200MB)大文件或者單個lmdb文件(240GB)時禁用python文件系統緩存。實際上,我並不需要一旦讀取就緩存這些文件。

+0

你有沒有解決過這個問題?我對這個話題非常感興趣。 在我的情況下,我並行加載'.json'文件。 'gc.collect()'似乎表現出了改進,但在這個階段我不完全確定這一點。我只是想知道爲什麼如果加載的文件超出範圍內存沒有得到釋放。這可能會有幫助:http://stackoverflow.com/a/5071376/4773274 – holzkohlengrill

回答

0

由於Python使用引用計數,大多數對象在刪除時被釋放。

唯一東西自動垃圾收集器爲您做的是收集和有循環引用的免費刪除的對象 - 例如 如果你有一個自稱或互稱對方的對象:

>>> class Foo(object): pass 
... 
>>> x, y = Foo(), Foo() 
>>> x.y = y 
>>> y.x = x 

如果你從未編寫創建這樣的引用,或者如果你創建它們,但隨後手動打破他們,所有的垃圾回收器是浪費你的CPU時間,試圖找到的東西收集不在代碼那裏。如果你有很多小物件,這將會使你的系統減慢。

我不知道你的hickle文件 - 有時有必要在讀或寫這樣的東西時創建循環引用,但對於很多代碼來說,處理垃圾收集器的最好辦法是完全關閉它關閉使用gc.disable()