使用内存映射矩阵进行 LU 分解

计算科学 线性代数 矩阵 线性求解器 r 内存管理
2021-12-21 23:29:55

我有一个 ~4.12 Tb 结构化的相对稀疏矩阵数据集(大约 8% 的矩阵条目非零),我想应用 LU 分解,但是,考虑到它的大小,将其加载到内存中并使用通常的BLAS 或 Eigen 例程是不可能的。

是否有一些 unix/linux 库可用于对内存映射矩阵数据集进行 LU 分解?

我发现 R 有一个用于内存映射矩阵的包(http://www.bigmemory.org),但我不是 R 专家,如果可以通过安装并尝试解决这个问题,我提前道歉,在我开始学习新的编程环境之前,我想问问这是否真的能解决问题。

谢谢!

1个回答

我不知道今天仍在使用的任何库,但您将要查找的文献搜索中的关键字是“内存不足求解器”或“核心求解器”——有效的线性求解器(和 LU 分解)在 1960 年代、70 年代和 80 年代,存储在磁盘(或当时的磁带)上的矩阵非常流行,当时内存既昂贵又小。

也就是说,即使在今天,4TB 也是一个令人难以置信的大容量。对于稀疏矩阵,LU 分解通常要密集得多,因此您必须预计任何 LU 分解都会达到数十或数百 TB——您可能会发现处理它的大小是不切实际的,因为它的时间太长了需要做 I/O。

您最好的选择当然是为线性系统使用迭代求解器。今天,您可以在集群上的 2-3000 个内核上将 4TB 存储到内存中。这是一个重要的,但不是一个不可行的规模。像 PETSc 和 Trilinos 这样的库会很乐意为您做到这一点。根据矩阵的属性和您要使用的预处理器,您可能再次需要(小)多个内存,然后是相应的多个内核。