2016-01-29 26 views
3

我使用一個800,000x350,000矩陣的Scipy CSR representation,我們假設它的M。我想計算點積M * M[0:x].T。現在取決於x的值,內存消耗增加。 x=1不明顯,但如果x=2000乘法過程需要大約8千兆字節的RAM。當我使用scipy乘以兩個CSR矩陣時,爲什麼會消耗太多內存?

我不知道,當我計算這個產品,爲什麼需要這麼多的內存相比,存儲稀疏矩陣(約30MB)會發生什麼。矩陣是否擴展用於乘法?

+0

Csr使用自己的編譯乘法。請參閱github上的sourse代碼以獲取參考文件。 – hpaulj

+0

使用linalg模塊時會發生這種情況嗎? – canesin

+0

我不認爲這是一個問題,但只是爲了確保測試'M * N',其中'N'形狀像'M [0:x] .T'但獨立(複製或新鮮製作)。 – hpaulj

回答

1

通過一段時間後,我發現,原因是稀疏矩陣乘法運算的結果每個操作調查的結果和內存消耗。事實上,在M中有很多零值。但M*M.T的結果是隻包含50%零的矩陣。因此,結果會消耗很多內存。

:假設的M每一行向量具有相同的索引在沒有零場但以外,是稀疏。那麼M*M.T的結果根本不會是稀疏(沒有零值)。

儘管如此,感謝您的幫助。

0

csr矩陣乘法的編譯芯在

https://github.com/scipy/scipy/blob/0cff7a5fe6226668729fc2551105692ce114c2b3/scipy/sparse/sparsetools/csr.h

圍繞線500開始,csr_matmat...函數找到。它包含對它基於的數學論文的參考。

調用A*B的Python代碼爲__mul__。查看您的csr矩陣的版本以確保它正在呼叫self._mul_sparse_matrix,您將看到最後稱爲self.format + '_matmat_pass1'(和pass2)。

假設它不訴諸密集的版本,你就必須學習的基本算法來理解這個內存的使用是否是現實與否。

相關問題