我使用一個800,000x350,000矩陣的Scipy CSR representation,我們假設它的M
。我想計算點積M * M[0:x].T
。現在取決於x
的值,內存消耗增加。 x=1
不明顯,但如果x=2000
乘法過程需要大約8千兆字節的RAM。當我使用scipy乘以兩個CSR矩陣時,爲什麼會消耗太多內存?
我不知道,當我計算這個產品,爲什麼需要這麼多的內存相比,存儲稀疏矩陣(約30MB)會發生什麼。矩陣是否擴展用於乘法?
我使用一個800,000x350,000矩陣的Scipy CSR representation,我們假設它的M
。我想計算點積M * M[0:x].T
。現在取決於x
的值,內存消耗增加。 x=1
不明顯,但如果x=2000
乘法過程需要大約8千兆字節的RAM。當我使用scipy乘以兩個CSR矩陣時,爲什麼會消耗太多內存?
我不知道,當我計算這個產品,爲什麼需要這麼多的內存相比,存儲稀疏矩陣(約30MB)會發生什麼。矩陣是否擴展用於乘法?
通過一段時間後,我發現,原因是稀疏矩陣乘法運算的結果每個操作調查的結果和內存消耗。事實上,在M
中有很多零值。但M*M.T
的結果是隻包含50%零的矩陣。因此,結果會消耗很多內存。
例:假設的M
每一行向量具有相同的索引在沒有零場但以外,是稀疏。那麼M*M.T
的結果根本不會是稀疏(沒有零值)。
儘管如此,感謝您的幫助。
csr
矩陣乘法的編譯芯在
圍繞線500開始,csr_matmat...
函數找到。它包含對它基於的數學論文的參考。
調用A*B
的Python代碼爲__mul__
。查看您的csr
矩陣的版本以確保它正在呼叫self._mul_sparse_matrix
,您將看到最後稱爲self.format + '_matmat_pass1'
(和pass2
)。
假設它不訴諸密集的版本,你就必須學習的基本算法來理解這個內存的使用是否是現實與否。
Csr使用自己的編譯乘法。請參閱github上的sourse代碼以獲取參考文件。 – hpaulj
使用linalg模塊時會發生這種情況嗎? – canesin
我不認爲這是一個問題,但只是爲了確保測試'M * N',其中'N'形狀像'M [0:x] .T'但獨立(複製或新鮮製作)。 – hpaulj