2013-04-30 5 views
1

메모리 누수가 하나 보이지만 해결 방법을 찾을 수없는 경우 잘 모르겠습니다. 나는 전체 코드를 붙여 그러나 여기 누출 부분입니다 수 없습니다파이썬 기본 dict 메모리 누수가

self.dctSpreads = defaultdict(list) 

lstMat = ['2Y','3Y','4Y','5Y','6Y','7Y','8Y','9Y','10Y','12Y','15Y','20Y','25Y','30Y'] 

lstSpreads = ['A','B','C','D','E'] 

def __GetSpreadMDValues__(self): 
     lstSpreadRIC = [] 
     lstSpreadVal = [] 

     #Construct proper RICs to extract the data 
     for i in range(0, len(self.lstSpreads)): 
      for j in range(0, len(self.lstMat)): 
       lstSpreadRIC.append(self.lstMat[j]) 
      #get market data 
      lstSpreadVal = self.__GetListDataSnaps__('FIELD1', lstCSASpreadRIC) 
      self.dctSpreads[self.lstSpreads[i]] = lstCSASpreadVal 
      lstSpreadRIC = [] 
      lstSpreadVal = [] 

문제는 내가 수행 한 후 메모리 사용량을 증가 없지만 결코 그것을 해제 (목록의 사전 부동 값입니다) self.dctSpreads는 작업이다 클래스 개체. 나는 메서드를 호출하는 것처럼 간단한 소멸자를 작성하려고 시도했다.

def Destructor(self): 
     gc.collect() 

내 실행이 완료되기 전에는 도움이되지 않았다.

의견을 보내 주시면 감사하겠습니다.

+3

파이썬 특수 메서드 이름과 값에'__' 이중 밑줄 이름 만 사용하고, 임의로 자체를 발명하지 않습니다. private 메소드는'__'을 접미사로 사용하지 않고 접미사로 사용합니다. –

+1

클래스 개체로 "완료"되었습니까? – Blender

+0

답장을위한 thnx Martijn, 이것은 코드의 일부일 뿐이며 클래스에 대해 private 인 __ 여기 표시된 메소드입니다. – ilyaw77

답변

2

Python 스크립트가 파이썬에서 사용하지 않는 메모리를 사용할 수있게 할 때와 파이썬 스크립트가 OS로 반환 될 때 사이에 차이가 있습니다. 전자는 (CPython을 가정 할 때) 객체에 대한 참조가 없을 때 즉시 발생하고 후자는 할당 된 객체의 유형에 따라 Python 인터프리터가 종료 될 때까지 발생하지 않을 수 있습니다. 이는 정상적이고 예상되는 동작입니다.

+0

답장을 보내 주셔서 감사합니다. 예상되는 행동이라고 생각하는 대부분의 사람들처럼 보입니다. 문제는 30 초마다 실행되는 프로그램이며 프로세스가 계속 커질 수 있습니다. dict 논리를 좀 더 간단한 유형 (목록 일 수 있음)으로 대체하면 도움이 될 것이라고 생각하십니까? – ilyaw77

+1

프로그램이 매 30 초마다 실행되는 경우, 하나의 루프가 완료되면 종료하지 않고 cron 또는 주기적으로 실행해야하는 이유는 무엇입니까? – kindall

+0

정확히 작동하는 방식입니다. 프로그램을 실행하는 별도의 스레드에서 열리고 모든 파일이 저장 될 때까지 기다린 후 20 초 동안 절전 모드를 다시 실행합니다. thrd = threading.Thread (target = MyPub), thrd.start(), thrd.join (60), time.sleep (20) – ilyaw77