最小化稀疏矩阵逆中的内存开销

时间:2016-10-18 19:39:06

标签: python scipy sparse-matrix

作为假装,我在前一个问题中继续开发Python 2.7:Determining a sparse matrix quotient

我现有的代码:

import scipy.sparse as sp

k = sp.csr_matrix(([], ([],[])),shape=[R,R])

denom = sp.csc_matrix(denominator)
halfeq = sp.linalg.inv(denom)
k = numerator.dot(halfeq)

我成功计算了基数kdenom。 Python继续尝试在halfeq上进行计算。在返回错误之前,该过程在大约2小时内处于不稳定状态

错误陈述:

Not enough memory to perform factorization.
Traceback (most recent call last):
  File "<myfilename.py>", line 111, in <module>
    halfeq = sp.linalg.inv(denom)
  File "/opt/anaconda/lib/python2.7/site-packages/scipy/sparse/linalg/matfuncs.py", line 61, in inv Ainv = spsolve(A, I)
  File "/opt/anaconda/lib/python2.7/site-packages/scipy/sparse/linalg/dsolve/linsolve.py", line 151, in spsolve Afactsolve = factorized(A)
  File "/opt/anaconda/lib/python2.7/site-packages/scipy/sparse/linalg/dsolve/linsolve.py", line 366, in factorized return splu(A).solve
  File "/opt/anaconda/lib/python2.7/site-packages/scipy/sparse/linalg/dsolve/linsolve.py", line 242, in splu ilu=False, options=_options)
MemoryError

scipy/smemory.c sourcecode开始,在第256行找到错误的初始语句。我无法进一步分析内存定义以确定如何最好地重新分配足以执行的内存使用量。

供参考,

numerator shape: (552297, 552297) stored elements: 301067607计算为sp.csr_matrix(A.T.dot(Ap))

denominator shape: (552297, 552297) stored elements: 170837213计算为sp.csr_matrix(A.T.dot(A))

编辑:我找到a related question on Reddit,但无法确定如何从numerator * inv(denominator) = k

更改方程式

1 个答案:

答案 0 :(得分:1)

无需预先分配&#39; k;这不是一种编译语言。并不是说这会花费任何成本。

k = sp.csr_matrix(([], ([],[])),shape=[R,R])

我需要仔细检查一下,但我认为dot/inv可以替换为spsolve的一次调用。请记住,在另一个问题中我注意到invspsolve(A, I);

denom = sp.csc_matrix(denominator)
#halfeq = sp.linalg.inv(denom)
#k = numerator.dot(halfeq)
k = sp.linalg.spsolve(denom, numerator)

也就是说,问题出现在inv部分,factorized(denom)。虽然您的数组稀疏,(denom密度为0.00056),但它们仍然具有大量值。

也许有必要退一步看看:

num = A.T.dot(Ap)
den = A.T.dot(A)
k = solve(den, num)

换句话说,检查矩阵代数。

(A'*Ap)/(A'*A)

我对此很生疏。我们可以减少这个吗?我们可以分区吗?

将大型数组放在一起,即使它们很稀疏,也无法正常工作。

如何提供可用于测试的小型AAp数组?我对测试内存限制不感兴趣,但我想尝试不同的计算方法。

稀疏linalg模块有许多迭代求解器。我不知道他们的记忆使用是或多或少。