Я пишу код, где в какой-то момент мне нужно решить несколько обобщенных задач на собственные значения для больших разреженных матриц. Поскольку эти операции в основном аналогичны (только название рассматриваемых матриц меняется), я сделал функцию:Python: минимизация использования памяти с помощью функций
def eig_prob(myvariables):
# this is just a simplified example
name = 'iteration_'+myvariables["i"]
A = myvariables["A"]
B = myvariables["B"]
N = myvariables["nb_eig"]
Z,V = eigsh(A,N,B,sigma = 1)
# save in Matlab format
scipy.io.savemat(files["exec"]+name+".mat",{"Z":Z,"V":V})
Как я не возвращаю аргумент моей основной функции, я бы ожидать, количество оперативной памяти быть одинаковым до и после звонка до eig_prob
.
На самом деле, я наблюдаю, что потребление оперативной памяти увеличилась примерно на 800 Мбайт во время вызова eig_prob
, который, как ожидается, и эта память не освобождаются после вызова, который, кажется удивительным для меня.
Есть ли какие-либо объяснения такого поведения? Можно ли этого избежать? Нужно ли мне запускать мою функцию в качестве вспомогательного процесса, чтобы избежать чрезмерного потребления памяти?
Редактировать: Мой коллега указал, что gs.collect()
[1] может помочь, он делает! При вызове после функции gs.collect()
освобождает 800 Мб.
[1] https://docs.python.org/2/library/gc.html
Вы можете попытаться вытеснить память с помощью gc.collect(). См. Http://stackoverflow.com/questions/1316767/how-can-i-explicitly-free-memory-in-python. –
Это не будет работать во всех случаях в CPython (хотя вам может быть повезло с PyPy и др.), Потому что CPython никогда не перемещает объекты (требуется id() 'всегда, чтобы всегда возвращать одинаковое значение в течение всей жизни объекта). Блок памяти не может быть выпущен, если он содержит хотя бы один живой объект. – Kevin