Python / Numpy MemoryError

时间:2010-11-30 21:03:54

标签: python memory numpy scipy

基本上,当我尝试在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只是一个双倍,而ur是上述大型矩阵(两者大小相同)。

我对内存错误知之甚少,特别是在Python中。任何有关解决此问题的见解/提示都将非常感激!

由于

3 个答案:

答案 0 :(得分:46)

重写

p *= alpha
u += p

这将使用更少的内存。而p = p*alphap*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只意味着在您调用的函数中,操作系统无法提供执行操作所需的内存。

如果您可以使用稀疏矩阵,这可能会为您节省大量内存。