2012-04-25 83 views
6

我有一個稀疏的數組,似乎太大而無法在內存中有效地處理(2000x2500000,float)。我可以把它變成一個稀疏的lil_array(scipy),但是如果我嘗試輸出一個列或行壓縮稀疏數組(A.tocsc(),A.tocsr()),我的機器內存耗盡(還有一個嚴重的不匹配4.4G文本文件和picilled lil array 12G中的數據 - 這將是一個更接近原始數據大小的磁盤格式)。numpy磁盤陣列上的大號

我可能會在未來討論更大的陣列。

問題:處理大型磁盤陣列的最佳方法是什麼,以便我可以透明地使用常規numpy函數。例如,沿行和列,矢量產品,最大值,最小值,切片等總和?

是pytables的路要走嗎?有沒有一個好的(快速)sql-numpy中間件層?磁盤陣列內置numpy的祕密?

在過去(略小)的數組中,我總是將長計算結果pickel-cached緩存到磁盤。這在陣列最終成爲4G左右但不再成立時起作用。

+0

當你醃製你的數組時,你確定使用二進制協議嗎?如果您使用默認的文本協議,那麼這可能是大文件大小的原因。 – DaveP 2012-04-26 05:57:37

回答

2

我經常使用memory-mapped numpy arrays來處理多GB數字矩陣。我發現他們爲我的目的工作得很好。顯然,如果數據的大小超過RAM的數量,則必須小心訪問模式以避免thrashing

+0

這可能是可行的,但對於稀疏數組來看似乎相當低效。有稀疏版本嗎? – 2012-04-25 16:32:40

+0

@AnonyBak:不是我所知道的。然而,一個2000x100000的'float32'密集數組的大小隻有800MB(在磁盤和內存中)。 – NPE 2012-04-25 19:22:57

+0

是的,我的原始問題中存在拼寫錯誤。它應該說2000x2500000。 – 2012-04-25 22:33:06