5

在有限元问题的背景下,我有一个 12800x12800 的稀疏矩阵。我正在尝试仅使用 MATLAB 的\运算符求解线性系统,但使用 mldivide 时出现内存不足错误。所以我只是想知道是否有办法加快速度。

我的意思是,像 LU 因式分解这样的东西在不再出现内存错误方面是否真的有帮助?我在首选项中将堆大小增加到 256 GB,这是我可以达到的最大值,但仍然出现内存不足错误。

另外,只是一个一般性的问题。我的笔记本电脑现在有 8GB 的​​ RAM。升级到 16GB 会有帮助吗?或者我可以做些什么来为 MATLAB 分配更多内存?我对这个东西很陌生。

在此处输入图像描述

4

4 回答 4

0

虽然反斜杠利用了 A 的稀疏性,但它使用的 qr 方法会生成需要分配 (number_occupied_elements)^3 内存的完整矩阵。您可以尝试几件事

  1. 如果你用几个对角线划分稀疏矩阵,你可以尝试用前向/后向替换来解决系统
  2. 试着把问题分解成更小的问题,你把问题分解成更小的问题
  3. 在开始矩阵划分之前运行 whos 看看哪些元素占用了你的内存,可以提前清除其中的任何一个吗?
  4. 如您在此处所述,不适用于您的问题,但是如果您的系统已定义(A 的行多于列),则使用伪逆(A.'*A)\(A.'*b)会产生使用较小列维度的结果

至于增加额外的内存;Matlab32 使用 2^32 字节的内存 (4 Gb),因此除非您使用 64 位版本,否则增加计算机上的物理 RAM 将无济于事。

于 2014-11-11T17:02:37.100 回答
0

根据thisthis,您有一些选项可以避免matlab中的内存不足问题:

  • 增加操作系统的虚拟内存
  • 在任务管理器中给予 MATLAB 进程更高的优先级
  • 使用 64 位版本的 MATLAB

几个月前,我在 matlab 中进行整数编程。我遇到了“内存不足”的问题,所以我使用了稀疏矩阵并按照上面提到的提示,终于解决了问题!

于 2013-12-19T18:25:15.290 回答
0

你被锁定在使用 mldivide 吗?听起来像是迭代方法的完美情况 - bicg、gmres 等?

于 2014-04-22T00:19:39.190 回答
0

MATLAB\通常会尝试几种方法来解决问题。首先,如果它发现矩阵的结构是对称的,它会尝试 Cholesky 分解。经过几个步骤如果找不到合适的答案,当前版本的 Matlab 使用 UMFPACK Suitsparse包。

UMFPack 是一种特定的 LU 实现,它在实践中以其速度和良好的内存使用而闻名。它还尝试减少填充并保持矩阵尽可能稀疏。这就是 MATLAB 使用此代码的原因。(我正在攻读 UMFPACK,在其创建者 Tim Davis 博士的监督下攻读博士学位)

因此,使用另一个 LU 分解将无济于事。它已经是一个 LU 分解。解决问题的最简单方法之一是在另一台具有更好内存的设备上测试您的问题,看看它是否有效。

我猜matlab会做一些垃圾收集并浪费一些内存,所以如果你直接使用UMFPACK它可能会对你有所帮助。您可以在 C/C++ 中实现它,也可以使用 MATLAB 接口。看看 SuitSparse 包。

根据您的矩阵结构,我认为 MATLAB 尝试使用 Cholesky;如果 Cholesky 内存管理失败,我不知道 MATLAB 的策略是什么。考虑到 Cholesky 在内存方面更容易管理。

还有其他软件包也可能对您有所帮助。CSparse 是一个轻量级的包,它可能会有所帮助。还有其他着名的软件包可能会有所帮助;搜索超级LU。

于 2016-10-27T04:31:10.313 回答