메모리 소비가 꾸준히 증가하는 파이썬 코드가 있습니다. 합법적으로 상당히 커질 수있는 몇 가지 객체가 있지만, 내가 관찰하고있는 메모리 발자국이 이러한 객체로 인한 것인지 아니면 제대로 폐기되지 않은 임시 객체를 가진 메모리를 낭비하고 있는지를 이해하려고 노력하고 있습니다. 최근 수작업 메모리 관리의 세계에서 최근의 변환으로, 나는 파이썬 런타임이 임시 객체를 다루는 방법의 아주 기본적인 측면을 정확히 이해하지 못한다고 생각합니다.임시 메모리의 메모리 소비 및 수명
def tweak_list(lst):
new_lst = copy.deepcopy(lst)
if numpy.random.rand() > 0.5:
new_lst[0] += 1 # in real code, the operation is a little more sensible :-)
return new_lst
else:
return lst
lst = [1, 2, 3]
cache = {}
# main loop
for step in xrange(some_large_number):
lst = tweak_list(lst) # <<-----(1)
# do something with lst here, cut out for clarity
cache[tuple(lst)] = 42 # <<-----(2)
if step%chunk_size == 0:
# dump the cache dict to a DB, free the memory (?)
cache = {} # <<-----(3)
질문 :
tweak_list
에서 만든new_list
의 수명은 무엇입니까 는 약이 일반 구조 (생략하고 관련없는 세부 사항)와 코드를 생각해? 출구에서 파손될 것인가 아니면 가비지 수집 될 것인가?tweak_list
에 반복적으로 전화를 걸면 오랜 기간 동안 소량의 목록이 반복적으로 생성됩니까?list
을tuple
으로 변환하면dict
키로 사용 되나요?dict
을 공백으로 설정하면 메모리가 해제됩니까?- 아니면 완전히 잘못된 관점에서 직접 문제에 접근하고 있습니까?
여기에 표시된 코드를 실행해도 시간이 지남에 따라 메모리가 증가합니까? – interjay
Q : 왜''deepcopy()''를 사용하고 있습니까? 귀하의 목록에 더 복잡한 객체가 포함되어 있습니까? 그렇지 않다면 얕은 사본을 사용하거나''list()''만을 사용하십시오. 그렇다면 누수가 복사되어 키로 캐시에 저장 될 가능성이 가장 높습니다. – lqc
@lqc : 여기에 (어쩌면 어리석은) 예제에서,'tweak_list'는 대략 50 %의 호출에서 그것의 인수를 수정합니다; 나머지 50 %에서는 목록을 그대로 두어야합니다. 물론, 나는 단지 'lst [:]'뷰를 조작 할 수 있었지만 실제로는 다를 것인가? –