基本上,当我尝试在numpy矩阵上执行代数运算时,我在python中遇到内存错误。变量u
,是一个双倍的大矩阵(在失败的情况下,它是一个288x288x156的双精度矩阵。我只在这个巨大的情况下得到这个错误,但我能够在其他大矩阵上做到这一点,只是没有这么大)。这是Python错误:
Traceback (most recent call last):
File "S:\3D_Simulation_Data\Patient SPM Segmentation\20 pc
t perim erosion flattop\SwSim.py", line 121, in __init__
self.mainSimLoop()
File "S:\3D_Simulation_Data\Patient SPM Segmentation\20 pc
t perim erosion flattop\SwSim.py", line 309, in mainSimLoop
u = solver.solve_cg(u,b,tensors,param,fdHold,resid) # Solve the left hand si
de of the equation Au=b with conjugate gradient method to approximate u
File "S:\3D_Simulation_Data\Patient SPM Segmentation\20 pc
t perim erosion flattop\conjugate_getb.py", line 47, in solv
e_cg
u = u + alpha*p
MemoryError
u = u + alpha*p
是失败的代码行。
alpha
只是一个双倍,而u
和r
是上述大型矩阵(两者大小相同)。
我对内存错误知之甚少,特别是在Python中。任何有关解决此问题的见解/提示都将非常感激!
由于
答案 0 :(得分:46)
重写
p *= alpha
u += p
这将使用更少的内存。而p = p*alpha
为p*alpha
的结果分配一个全新的矩阵,然后丢弃旧的p
; p*= alpha
做了同样的事情。
通常,对于大型矩阵,请尝试使用op=
分配。
答案 1 :(得分:11)
我发现避免内存错误的另一个提示是手动控制garbage collection。当删除对象或使用我们的范围时,在执行垃圾收集之前,不会释放用于这些变量的内存。我发现我的一些代码使用了大型numpy数组,我得到了一个MemoryError,但如果我在适当的地方插入对gc.collect()的调用,我可以避免这种情况。
如果使用“op =”样式运算符等不能解决您的问题,您应该只考虑此选项,因为在任何地方调用gc.collect()都可能不是最好的编码实践。
答案 2 :(得分:6)
您的矩阵有288x288x156 = 12,939,264个条目,double
的内存可能达到400MB。 numpy
向您抛出MemoryError
只意味着在您调用的函数中,操作系统无法提供执行操作所需的内存。
如果您可以使用稀疏矩阵,这可能会为您节省大量内存。