scala中没有空值的大型稀疏矩阵的乘法

Multiplication of large sparse Matrices without null values in scala

我有两个非常稀疏的分布矩阵,维度为 1,000,000,000 x 1,000,000,000,我想高效地计算矩阵乘法。

我试图从 CoordinateMatrix 创建 BlockMatrix,但它需要大量内存(实际上非​​零数据约为 500'000'000)并且计算时间非常长。

所以还有另一种方法可以在 Spark 中以分布式方式创建稀疏矩阵并高效地计算乘法?或者我必须手动计算?

您显然必须为稀疏矩阵使用一种利用其稀疏性的存储格式。

现在,在不知道您如何处理矩阵和使用哪些库的情况下,除了要求您查看您选择的线性代数库并寻找稀疏存储格式外,没有任何帮助; "good old" 基于 Fortran 的库是许多现代数学库的基础,它们都支持它们,因此您可能真的需要做一些事情,但只需使用 yourlibraryname + "sparse matrix".

再想:

稀疏矩阵确实不太适合分布;考虑与实际 multiplications/additions 相比,您必须执行哪些操作来协调分布。

此外,1e18 元素矩阵中的 ~5e8 个非零元素肯定大量内存,并且由于您没有指定您考虑多少很多,很有可能没什么问题。假设您使用默认的 double 精度,即 5e8 * 8B = 4GB 的纯数字,不包括稀疏存储所需的坐标。所以,如果你有 ~10GB 的内存,我一点也不会感到惊讶。

因为 Spark 中没有内置方法来执行与稀疏矩阵的矩阵乘法。我通过在使用 BlockMatrix(不支持稀疏矩阵)执行矩阵乘法之前最多减少矩阵的稀疏性来解决。

最后编辑:即使进行了稀疏性优化,我在处理大型数据集时也遇到了很多问题。最后,我决定自己实现。现在 运行 非常快。我希望在 Spark 中实现具有稀疏矩阵的矩阵实现,因为我认为有很多应用程序可以利用它。