2014-05-23 67 views
2

我是新來的Python,我不確定爲什麼我看到內存使用率大幅上升,當我使用Numpy hstack將兩個pandas數據幀連接在一起。與pandas.concat的表現更糟 - 如果它完成 - 所以我使用NumPy。Numpy hstack爆炸內存

這兩個數據幀是比較大的,但我有20 GB免費RAM(使用11GB,包括我想複製的兩個數據幀)。

數據幀a和b具有形狀:

a.shape (66377, 30) 
b.shape (66377, 11100) 

當我使用np.hstack((a,b))自由20GB是不得不被完全用完。

+0

什麼數據的'dtype'?對於float64,'b'應該大約5.5 GB,所以'np.hstack'的結果也應該只增加大約5.5 GB。 – JoshAdel

+0

他們是float64 –

回答

1

檢查每個數組的內存使用情況如圖所示in this thread是不可能追加到位數組,這不會是有效的,因爲難保保持內存中的擴展陣列持續不斷。

Python的垃圾收集器應該釋放你的記憶,如果你串聯陣列之後刪除對象ab

a = append(a, b, axis=1) 
del b 

,如果它不釋放,你可以強制:

import gc 
gc.collect() 
+0

調用gc只會對循環引用做些什麼,你不應該讓它們與Numpy無論如何。 – Davidmh

+0

@Davidmh你是對的,但是在解決了[這個應用程序]中的內存泄漏後,我對'gc.collect()'有了'adicted'(https://github.com/compmech/compmech/blob/master/compmech /conecyl/conecyl.py)使用它。泄漏是由於Cython + scipy.sparse.csr_matrix + Numpy的一些問題,我仍然不知道... –

2

np.hstack返回一個包含底層數據副本的新數組,因此當您這樣做時,您的內存使用量翻了一番。

可以使用a.nbytesb.nbytes