7

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

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

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

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

4

3 回答 3

1

如果非零条目足够少,我建议创建一个具有适当维度和最大非零条目的稀疏矩阵 S;参见matlab 创建稀疏矩阵。然后正如@oleg komarov 所描述的,将矩阵加载到块中,并将每个块中的非零条目分配到稀疏矩阵 S 中的正确地址中。我觉得如果你的矩阵足够稀疏,那么加载它确实是你面临的唯一困难. 我对大型转运运营商也有类似的问题。

于 2013-09-15T01:24:52.473 回答
0

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

如果您对其他方法感兴趣,您可以看看核外计算,它旨在推广新方法来处理不能全部驻留在内存中的巨大数据集,而是将其存储在磁盘上并有效地加载必要的。

对于实用的方法,您可以查看 Blaze for Python(注意:仍在开发中!)。

于 2014-06-16T14:48:53.453 回答
0

您是否考虑过分块执行处理?转置和乘法非常适合块矩阵处理(参见https://en.wikipedia.org/wiki/Block_matrix),这将使您绕过有关索引的任何限制。

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

于 2013-07-07T01:47:40.417 回答