关于内存:Python / Numpy MemoryError

Python/Numpy MemoryError

基本上,当我尝试在numpy矩阵上执行代数运算时,我在python中遇到内存错误。 变量u是一个大的double矩阵(在失败的情况下,它是288x288x156的double矩阵。在这种情况下,我只会出现此错误,但是我可以在其他大型矩阵上执行此操作,但不是那么大) )。 这是Python错误:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
 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中。 任何见解/提示解决此问题将不胜感激!

谢谢


改写为

1
2
p *= alpha
u += p

这样会占用更少的内存。而p = p*alphap*alpha的结果分配一个全新的矩阵,然后丢弃旧的pp*= alpha执行相同的操作。

通常,对于大型矩阵,请尝试使用op=分配。


我发现避免内存错误的另一个技巧是手动控制垃圾回收。当对象被删除或超出范围时,在执行垃圾回收之前,不会释放用于这些变量的内存。我发现使用大型numpy数组的某些代码中出现MemoryError,但是如果在适当的位置插入对gc.collect()的调用,则可以避免这种情况。

仅当使用" op ="样式运算符等不能解决您的问题时,才应考虑使用此选项,因为到处都有gc.collect()调用可能不是最佳的编码实践。


您的矩阵有288x288x156 = 12,939,264个条目,对于double,它们的内存可能为400MB。 numpy向您抛出MemoryError只是意味着在您调用的函数中,执行操作系统所需的内存不可用。

如果可以使用稀疏矩阵,则可以节省大量内存。