作为假装,我在前一个问题中继续开发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)
我成功计算了基数k
和denom
。 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
答案 0 :(得分:1)
无需预先分配&#39; k
;这不是一种编译语言。并不是说这会花费任何成本。
k = sp.csr_matrix(([], ([],[])),shape=[R,R])
我需要仔细检查一下,但我认为dot/inv
可以替换为spsolve
的一次调用。请记住,在另一个问题中我注意到inv
是spsolve(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)
我对此很生疏。我们可以减少这个吗?我们可以分区吗?
将大型数组放在一起,即使它们很稀疏,也无法正常工作。
如何提供可用于测试的小型A
和Ap
数组?我对测试内存限制不感兴趣,但我想尝试不同的计算方法。
稀疏linalg模块有许多迭代求解器。我不知道他们的记忆使用是或多或少。