큰 스파 스 행렬에 대해 여러 가지 일반화 된 고유 값 문제를 해결해야하는 코드를 작성하고 있습니다. 내 주요 기능에 어떤 인수를 반환하지 않기 때문에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})
, 나는 RAM 메모리의 양을 기대 : 이러한 작업은 (고려 행렬의 이름 만 변경하는) 본질적으로 유사하기 때문에, 나는 함수를 만든 eig_prob
로 전화하기 전과 후에 동일하게하십시오.
는 사실, 나는 예상된다 eig_prob
에 통화 중 약 800 메가 증가 RAM 메모리의 소비,이 메모리는 나에게 놀라운 보인다 호출, 후 해제되지 않습니다 관찰.
그런 행동에 대한 설명이 있습니까? 그것을 피할 수 있습니까? 메모리를 과도하게 소비하지 않도록 내 기능을 하위 프로세스로 실행해야합니까?
편집 : 내 동료가 gs.collect()
[1]이 도움이 될 수도 있음을 나타냅니다. 함수 뒤에 호출하면 gs.collect()
은 800Mb를 해제합니다. 파이썬 객체가 할당되면
[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이 결코 객체를 재배치하지 않기 때문에 (CPython 외에도 더 나은 행운 이겠지만) CPython에서는 모든 경우에 작동하지 않습니다. (객체의 수명 내내 항상 동일한 값을 반환하는 데는 id()가 필요합니다. 적어도 하나의 활성 객체를 보유하고있는 한 메모리 블록을 해제 할 수 없습니다. – Kevin