Scipy稀疏反转或spsolve导致UMFPACK_ERROR_OUT_OF_MEMORY

时间:2015-12-17 11:39:21

标签: python scipy umfpack

我试图反转一个大的require稀疏矩阵,如下所示:

(150000,150000)

导致以下错误消息:

import scipy as sp
import scipy.sparse.linalg as splu

#Bs is a large sparse matrix with shape=(150000,150000)

#calculating the sparse inverse
iBs=splu.inv(Bs)

我重新编写程序以简单地求解线性微分方程组:

Traceback (most recent call last):
    iBs=splu.inv(Bs)
  File "/usr/lib/python2.7/dist-packages/scipy/sparse/linalg/dsolve/linsolve.py", line 134, in spsolve
autoTranspose=True)
  File "/usr/lib/python2.7/dist-packages/scipy/sparse/linalg/dsolve/umfpack/umfpack.py", line 603, in linsolve
self.numeric(mtx)
  File "/usr/lib/python2.7/dist-packages/scipy/sparse/linalg/dsolve/umfpack/umfpack.py", line 450, in numeric
umfStatus[status]))
RuntimeError: <function umfpack_di_numeric at 0x7f2c76b1d320> failed with UMFPACK_ERROR_out_of_memory

我再次遇到同样的错误

我在具有16 GB RAM的计算机上使用此代码,然后将其移动到具有32 GB RAM的服务器上,但仍无济于事。

有没有人遇到过这个?

2 个答案:

答案 0 :(得分:2)

首先让我说,http://scicomp.stackexchange.com应该更好地问这个问题,那里有一个很好的计算科学和数值线性代数专家社区。

让我们从基础开始:从不反转稀疏矩阵,它完全没有意义。请参阅MATLAB中心的discussion,特别是Tim Davis的comment

简要说明:没有用于数字反转矩阵的算法。每当您尝试以数字方式计算NxN矩阵的逆矩阵时,实际上就可以求解N个线性系统,其中N rhs向量对应于单位矩阵的列。

换句话说,当你计算

from scipy.sparse import eye
from scipy.sparse.linalg import (inv, spsolve)

N = Bs.shape[0]
iBs = inv(Bs)
iBs = spsolve(Bs, eye(N))

最后两个语句(inv(eye)spsolve(Bs, eye(N)))是等效的。请注意,身份矩阵(eye(N)是一个向量(np.ones(N)),因为您提出错误假设。

这里的要点是矩阵求逆在数值线性代数中很少有用:Ax = b的解不是作为inv(A)* b计算的,而是通过专门算法计算的。

针对您的具体问题,对于大型稀疏方程组,没有黑盒求解器。只有在充分了解矩阵问题的结构和属性时,才能选择正确的求解器类。反过来,你的矩阵的属性是你试图解决的问题的结果。例如。当你通过FEM对椭圆偏微分方程组进行离散时,最终会得到一个对称正稀疏的代数方程组。一旦了解了问题的属性,就可以选择正确的求解策略。

在您的情况下,您尝试使用通用直接求解器,而无需重新排序方程式。众所周知,这将产生填充,在iBs函数的第一阶段(应该是因子分解)中破坏spsolve矩阵的稀疏性。请注意完全双精度150000 x 150000矩阵需要大约167 GB的内存。有很多技术可以重新排序方程式,以减少因子分解过程中的填充,但是你没有提供足够的信息来为你提供合理的提示。

对不起,你应该考虑在http://scicomp.stackexchange.com上重新阐述你的问题,明确说明你要解决的问题是什么,以便给出矩阵结构和属性的线索。

答案 1 :(得分:0)

稀疏数组只能将矩阵的非零条目拟合到内存中。现在假设你进行了反演。这意味着矩阵的几乎所有条目都变为非零。稀疏矩阵是内存优化的。

有一些操作可以应用于稀疏矩阵而不会丢失&#34;备用&#34;属性:

  • 另外,只需添加一个常量就可以保持稀疏矩阵稀疏。