我有两个非常稀疏的分布矩阵,其维度为1,000,000,000 x 1,000,000,000,我想有效地计算矩阵乘法。
我试图从CoordinateMatrix创建一个BlockMatrix但是它的内存很多(实际上非零数据大约是500'000'000)并且计算时间很长。
那么还有另一种方法可以创建稀疏矩阵并在Spark中以分布式方式有效地计算乘法吗?或者我必须手动计算它?
答案 0 :(得分:0)
显然,您必须使用稀疏矩阵的存储格式来利用它们的稀疏性。
现在,在不知道如何处理矩阵以及使用哪些库的情况下,除了要求您查看所选的线性代数库并查找稀疏存储格式之外,没有任何帮助。 "好老"基于Fortran的库可以支持很多现代数学库,所以很有可能你真的不得不用 yourlibraryname +"稀疏矩阵" 进行一些谷歌搜索。 / p>
第二个想法:
稀疏矩阵实际上并不适合分发;考虑与实际乘法/加法相比,你必须做的协调分配的操作。
此外,1e18元素矩阵中的~5e8非零元素绝对是大量内存,因为你没有指定你认为多少它是,它很可能没有任何问题。假设您使用默认的double
精度,那5e8 * 8B = 4GB纯数,不计算稀疏存储所需的坐标。所以,如果你有大约10GB的内存,我一点都不会感到惊讶。
答案 1 :(得分:-3)
由于Spark中没有内置方法来执行与稀疏矩阵的矩阵乘法。我通过在使用BlockMatrix(不支持稀疏矩阵)执行矩阵乘法之前最多减少矩阵的稀疏性来解决。
上次编辑:即使使用稀疏性优化,我在使用大型数据集时遇到了很多问题。最后,我决定自己实施它。现在运行得非常快。我希望在Spark中实现具有稀疏矩阵的矩阵实现,因为我认为有很多应用程序可以使用它。