我正在尋找Java中的稀疏矩陣庫,該庫可以在稀疏整數矩陣上進行乘法運算,其中矩陣表示圖的鄰接關係。要求大致如下:庫應能夠加載和乘以10M×10M個元素的幾個矩陣,其中包含大約3個元素。在商用計算機上運行時,每個5M非零元素(約16 GB RAM)。 C ++的 Eigen庫滿足此要求。但是,我找不到適合Java的替代方法。
我查看了以下庫:
-
SparseMatrix
類 Spark ML庫中的似乎僅支持使用密集矩陣的乘法。- 深入挖掘微風庫 Spark ML所使用的指出以下內容:“尚未完全支持CSCMatrices。它們缺少一些基本操作。”
- 還值得注意的是在內部,Breeze使用
netlib-java
庫。
-
Apache Commons Math的OpenMapRealMatrix
類拋出NumberIsTooLargeException
,因為它僅支持帶有2B元素的矩陣(“ 40,000,000,000大於或等於最大值(2,147,483,647)“ ) - Colt庫的
SparseDoubleMatrix2D
類引發Java堆空間錯誤。 - 第
DMatrixSparseCSC
類e 有效的Java矩陣庫在初始化大型矩陣時引發java.lang.NegativeArraySizeException
。 strike>自問題解決以來,此問題已得到解決-請參見作者的評論和接受的答案。 - Matrix Toolkit Java的
LinkedSparseMatrix
類初始化速度非常快,但不能很好地處理乘法-將空的1M×1M乘以矩陣大約需要6分鐘。CompDiagMatrix
用盡了該大小的矩陣的內存。FlexCompColMatrix
和FlexCompRowMatrix
都不會在10分鐘內完成。CompRowMatrix
和CompColMatrix
在大約20k×20k矩陣中具有良好的性能,但對於較大的矩陣,其性能卻有所下降。 (最新穩定版本的Javadoc 1.0.4不建議在靜態情況下使用哪個稀疏矩陣。拉取請求提交了更詳細的文檔,但是1.0.5-SNAPSHOT從未這樣做過 - Graphulo是 GraphBLAS的實現,但使用起來非常複雜,因為它旨在在 Apache Accumulo數據庫的頂部。
- 通用Java矩陣包(UJMP)非常適合在紙上使用,但性能不佳。此外,它似乎已被廢棄,並且已獲得LGPL許可。
- 最後,各種 JCuda庫都可能有用,包括 JCusparse和 JNvgraph,但是所有這些都需要GPU。
我還在創建的 https://java-matrix.org/上找到了一項全面的調查由UJMP的作者撰寫,該書展示了〜2015年的最新技術,並強調了很少有庫支持稀疏矩陣。
另請參閱 GitHub問題,了解MTJ中稀疏矩陣乘法的性能。
2010年以來有關C / C ++庫的一個相關問題:尋找C / C ++接口以在Linux中高效地計算巨大的稀疏矩陣
更新(2019年末):我現在已經在這一領域進行了一年多的研究,並確定了稀疏矩陣庫需要滿足的一些要求,以便表達圖形算法並有效地執行它們:
- 支持對半環的定義,而不是傳統的加時算術運算法則(例如lor-land,min-plus)
- 支持屏蔽操作(僅執行給定操作
- 允許多線程執行 ol>
到目前為止,我找不到能滿足 any em的Java庫>以上要求。因此,我切換到C並使用 SuiteSparse:GraphBLAS。
更新(2020年9月): EJML現在滿足#1的要求,請參見拉動請求引入對半環的支持。