2015-01-16 4 views
1

Я пишу код, где в какой-то момент мне нужно решить несколько обобщенных задач на собственные значения для больших разреженных матриц. Поскольку эти операции в основном аналогичны (только название рассматриваемых матриц меняется), я сделал функцию: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

+1

Вы можете попытаться вытеснить память с помощью gc.collect(). См. Http://stackoverflow.com/questions/1316767/how-can-i-explicitly-free-memory-in-python. –

+0

Это не будет работать во всех случаях в CPython (хотя вам может быть повезло с PyPy и др.), Потому что CPython никогда не перемещает объекты (требуется id() 'всегда, чтобы всегда возвращать одинаковое значение в течение всей жизни объекта). Блок памяти не может быть выпущен, если он содержит хотя бы один живой объект. – Kevin

ответ

0

Если объект Python выделяется, это случается, положить на куче программы.

Если это довольно большой объект, память будет распределяться через mmap() столько, сколько потребуется и освобождается после этого. Я не уверен, что это произойдет немедленно ...

Для объектов меньшего размера граница brk() будет сдвинута. В этом случае выделяется память. Если после этого добавляются некоторые другие объекты, а первые объекты освобождаются, их память свободна в куче, но не может быть возвращена ОС. Только после того, как объект конца в куче будет освобожден, часть свободной области может быть возвращена в ОС.

Вы говорите о 800 МБ, что явно настолько велико, что следует использовать метод mmap(), но если данные состоят из тысяч меньших объектов, есть вероятность, что они приземляются на кучу brk().

+0

кажется, что единственный способ освободить память в моем случае - это убить процесс ... – Alain

 Смежные вопросы

  • Нет связанных вопросов^_^