2015-01-16 3 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}) 

, 나는 RAM 메모리의 양을 기대 : 이러한 작업은 (고려 행렬의 이름 만 변경하는) 본질적으로 유사하기 때문에, 나는 함수를 만든 eig_prob로 전화하기 전과 후에 동일하게하십시오.

는 사실, 나는 예상된다 eig_prob에 통화 중 약 800 메가 증가 RAM 메모리의 소비,이 메모리는 나에게 놀라운 보인다 호출, 후 해제되지 않습니다 관찰.

그런 행동에 대한 설명이 있습니까? 그것을 피할 수 있습니까? 메모리를 과도하게 소비하지 않도록 내 기능을 하위 프로세스로 실행해야합니까?

편집 : 내 동료가 gs.collect() [1]이 도움이 될 수도 있음을 나타냅니다. 함수 뒤에 호출하면 gs.collect()은 800Mb를 해제합니다. 파이썬 객체가 할당되면

[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이 결코 객체를 재배치하지 않기 때문에 (CPython 외에도 더 나은 행운 이겠지만) CPython에서는 모든 경우에 작동하지 않습니다. (객체의 수명 내내 항상 동일한 값을 반환하는 데는 id()가 필요합니다. 적어도 하나의 활성 객체를 보유하고있는 한 메모리 블록을 해제 할 수 없습니다. – Kevin

답변

0

, 프로그램의 힙에 넣어 될 일어난다.

매우 큰 개체 인 경우 메모리가 필요할 때만 mmap()을 통해 할당되고 나중에 다시 해제됩니다. 즉시 발생하는지 확실하지 않습니다 ...

작은 개체의 경우 프로세스의 경계가 바뀝니다 (brk()). 이 경우 메모리가 할당됩니다. 나중에 다른 오브젝트가 추가되고 이전 오브젝트가 해제 된 경우, 해당 메모리는 힙에서 사용 가능하지만 OS로 리턴 될 수 없습니다. 끝 부분의 힙에있는 객체가 해제 된 후에 만 ​​여유 공간의 일부가 OS로 다시 이동 될 수 있습니다.

당신은 분명히 mmap() 메쏘드가 사용되어야하는 800 메가 바이트에 대해 이야기하지만, 데이터가 수천 개의 더 작은 객체들로 구성되어 있다면, 그들은 brk() 힙에 도착할 가능성이 있습니다.

+0

내 경우에 메모리를 확보 할 수있는 유일한 방법은 프로세스를 죽이는 것입니다 ... – Alain