2010-11-30 2 views
16

В принципе, я получаю ошибку памяти в python при попытке выполнить алгебраическую операцию на матрице numpy. Переменная 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 всего лишь двойной, а u и r - это большие матрицы, описанные выше (оба одинакового размера).

Я не так много знаю об ошибках памяти, особенно в Python. Любое понимание/советы в решении этого было бы очень оценено!

Благодаря

ответ

39

Rewrite в

p *= alpha 
u += p 

и это будет использовать гораздо меньше памяти. В то время как p = p*alpha выделяет совершенно новую матрицу для результата p*alpha, а затем удаляет старый p; p*= alpha делает то же самое на месте.

В целом, с большими матрицами, попробуйте использовать назначение op=.

5

Ваша матрица имеет 288x288x156 = 12939264 записей, которые для double могли прийти к 400MB памяти. numpy бросая MemoryError у вас просто означает, что в функции, которую вы назвали памятью, необходимой для выполнения операции, не было доступно из ОС.

Если вы можете работать с разреженными матрицами, это может сэкономить вам много памяти.

+2

Но мой компьютер имеет 24 ГБ оперативной памяти ... есть ли способ убедиться, что больше всего доступно из окон? Редактирование: версия используемого нами python 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() в соответствующих местах.

Вы должны изучить этот параметр только в том случае,