大型稀疏矩阵乘法

时间:2013-06-12 21:18:24

标签: matlab matrix octave matrix-multiplication sparse-matrix

我有一个非常大且稀疏的矩阵,大小为180GB(文本,30k * 3M),仅包含条目而没有其他数据。我必须对它进行矩阵乘法,求逆和一些类似的线性代数运算。我尝试了八度和简单的单线程C代码进行乘法,但是40GB的系统RAM很快用完,然后我发现程序开始抖动。还有其他选择吗?我不熟悉MathLab或任何其他可以帮助我这样做的矩阵操作库。

当我运行具有10行和3 M列的两个矩阵的简单矩阵乘法及其转置时,它会出现以下错误:

    memory exhausted or requested size too large for range of Octave's index type

我不确定这些是否适用于Matlab。对于稀疏矩阵表示和矩阵乘法,是否有另一个库或代码。

3 个答案:

答案 0 :(得分:1)

如果有足够的非零条目,我建议创建一个具有适当尺寸和最大非零条目的稀疏矩阵S;见matlab create sparse matrix。然后正如@oleg komarov所描述的那样,在块中加载矩阵并将每个块中的非零条目分配到稀疏矩阵S中的正确地址。我觉得如果你的矩阵足够稀疏,那么加载它实际上是你面临的唯一困难。我遇到了与大型转移运营商类似的问题。

答案 1 :(得分:0)

您是否考虑过以块为单位进行处理?转置和乘法在块矩阵处理中非常有效(参见https://en.wikipedia.org/wiki/Block_matrix),这将使您了解有关索引的任何限制。

这不会帮助您进行矩阵求逆,除非您在对角线上没有的块完全为空时可以在块中分解矩阵,这在您的假设中没有说明。 / p>

答案 2 :(得分:0)

Octave的内存资源约为2GB,矩阵可以容纳的最大索引数约为2 ^ 32(32位八度)。 MatLab没有这样的内存限制,因为它将使用所有内存资源,包括交换文件。因此,您可以通过设置一个巨大的交换文件来尝试使用MatLab,然后您可以计算您的操作(但无论如何它都会花费很长时间......)。

如果您对其他方法感兴趣,可以考虑一下核心外计算,该计算旨在促进处理无法驻留在内存中的大型数据集的新方法,而是将其存储在磁盘上并有效地加载必要的位。

对于实用的方法,你可以看一下Blaze for Python(注意:还在开发中!)。