2010-11-30 111 views
16

基本上,我试图在numpy矩阵上执行代数运算时,在python中出现内存错误。变量u是一个双倍的大矩阵(在失败的情况下它是一个288x288x156双精度矩阵,在这个巨大的情况下我只能得到这个错误,但我可以在其他大矩阵上做这个,只是不是这么大)。这里是Python错误:Python/Numpy MemoryError

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中。任何洞察力/提示解决这个问题将非常感激!

感谢

回答

39

改写为

p *= alpha 
u += p 

,这将使用更少的内存。而p = p*alphap*alpha分配一个全新的矩阵,然后丢弃旧的p; p*= alpha做了同样的事情。

一般情况下,对于大矩阵,请尝试使用op=赋值。

5

你的矩阵具有288x288x156 = 12939264的条目,这对于double能够站出来,以400MB内存。 numpy抛出MemoryError只是意味着在您调用的函数中执行操作所需的内存不可用于操作系统。

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

+2

但我的电脑有24GB的内存...有没有办法确保更多可用的Windows?编辑:由于某些原因,我们使用的是32位版本:/ Edit2:不幸的是,稀疏矩阵不是一个选项,因为所有元素都有值(热方程如问题)。 – tylerthemiler 2010-11-30 21:18:19

+0

谢谢,我从内存中清除了一些东西,现在我可以加载它。 – tylerthemiler 2010-11-30 22:35:56

+0

@tylerthemiler:使用非官方的64位版本http://www.lfd.uci.edu/~gohlke/pythonlibs/ – endolith 2013-10-31 18:52:25

9

我发现避免内存错误的另一个技巧是手动控制garbage collection。当对象被删除或进入我们的作用域时,用于这些变量的内存不会被释放,直到执行垃圾收集为止。我发现我的一些代码使用大的numpy数组,我得到一个MemoryError,但如果我在适当的位置插入对gc.collect()的调用,我可以避免这种情况。

如果使用“op =”样式运算符等并不能解决您的问题,那么您应该只查看此选项,因为它可能不是最好的编码习惯,因为gc.collect()调用无处不在。