2012-01-21 43 views
1

下面的代碼應該做我想做的事情,但在循環完成20%時需要10g內存。DataFrame to Panel由非唯一列與Pandas索引

# In [4]: type(pd) 
# Out[4]: pandas.sparse.frame.SparseDataFrame 
memid = unique(pd.Member) 
pan = {} 
for mem in memid: 
    pan[mem] = pd[pd.Member==mem] 
goal = pandas.Panel(pan) 
+0

什麼是尺寸('pd.shape')和密度SparseDataFrame的('pd.density')?你可以發郵件給我一個對象的醃菜('pd.save(file_path)'),讓我看看嘗試診斷什麼?順便提一下,這些問題在郵件列表上會比SO好。 –

+0

pd.shape =(2668990,232) –

+0

pd.density = 0.12814551216649045該文件太大而無法通過電子郵件發送。 –

回答

2

我在這裏創建了一個GitHub問題。

https://github.com/wesm/pandas/issues/663

我敢肯定,我確定導致內存泄漏NumPy的ndarray視圖之間的循環引用。只是犯了修復:

https://github.com/wesm/pandas/commit/4c3916310a86c3e4dab6d30858a984a6f4a64103

是否可以從源代碼安裝,讓我知道是否能解決問題了嗎?

順便說一句,你可能會嘗試使用SparsePanel而不是Panel,因爲Panel會將所有的子DataFrames轉換爲密集形式。

最後,你可能會考慮使用groupby作爲SparseDataFrame的替代方案O(N * M)。它甚至更短:

pan = dict(pd.groupby('Member'))

+0

我運行的版本是昨晚的git克隆。感謝SparsePanel。當我運行pan = dict(pd.groupby('Member'))時,我得到:RuntimeError:調用Python對象時超出最大遞歸深度。加載時實際的物體佔用小於1gb,但循環導致內存緩慢地被吃掉。我從現在開始將我的問題提交給郵件列表。 –

+0

必須是SparseDataFrame的groupby問題。我得看看。如果你能以某種方式讓我對SparseDataFrame進行簡單的醃製(它應該少於100兆字節),我可以仔細觀察一下 –

相關問題