복붙노트

[PYTHON] 파이썬 사전에 항목을 삭제 한 후 메모리를 되찾기

PYTHON

파이썬 사전에 항목을 삭제 한 후 메모리를 되찾기

나는 파이썬에서 상대적으로 큰 사전을 가지고 있으며, 그것으로부터 아이템을 삭제할뿐만 아니라 실제로 프로그램에서 삭제 된 것들로부터 메모리를 회수 할 수 있기를 원합니다. 사전에서 항목을 삭제하고 가비지 수집기를 수동으로 실행하더라도 Python은 메모리 자체를 해제하지 않는 것으로 보이는 문제를 겪고 있습니다.

이에 대한 간단한 예 :

>>> tupdict = {}
# consumes around 2 GB of memory
>>> for i in xrange(12500000):
...   tupdict[i] = (i,i)
... 
# delete over half the entries, no drop in consumed memory
>>> for i in xrange(7500000):
...   del tupdict[i]
... 
>>> import gc
# manually garbage collect, still no drop in consumed memory after this
>>> gc.collect()
0
>>> 

무슨 일이 벌어지고 있는지 상상해 봅니다. 엔트리가 삭제되고 가비지 컬렉터가 실행되지만 파이썬은 사전 크기를 조정하지 않습니다. 제 질문은이 문제를 해결할 수있는 간단한 방법이 있습니까, 아니면 프로그램 작성 방법에 대해 더 많이 재고 할 필요가 있습니까?

해결법

  1. ==============================

    1.파이썬이이 메모리를 기반 OS로 반환 할 것인지 아닌지를 결정하는 많은 요소가 있습니다. 이는 메모리가 해제되는지 여부를 알려주는 방법 일 것입니다. CPython은 풀린 메모리를 유지하면서 효율적인 방식으로 재사용 할 수있는 풀링 된 할당 자 시스템을 가지고 있습니다 (그러나 이러한 후속 할당은 OS의 관점에서 메모리 풋 프린트를 증가시키지 않습니다) 다시 보게.

    파이썬이이 메모리를 기반 OS로 반환 할 것인지 아닌지를 결정하는 많은 요소가 있습니다. 이는 메모리가 해제되는지 여부를 알려주는 방법 일 것입니다. CPython은 풀린 메모리를 유지하면서 효율적인 방식으로 재사용 할 수있는 풀링 된 할당 자 시스템을 가지고 있습니다 (그러나 이러한 후속 할당은 OS의 관점에서 메모리 풋 프린트를 증가시키지 않습니다) 다시 보게.

    또한 일부 유닉스 플랫폼에서 프로세스는 응용 프로그램이 닫힐 때까지 (또는 다른 중요한 이벤트가 발생할 때까지) 해제 된 메모리를 OS로 다시 릴리스하지 않습니다. 풀 전체가 해제 된 상황에서 (그리고 파이썬이 미래의 객체에 대해 열린 상태로 유지하기보다는) 자유롭게 결정할 수도 있지만, OS는 여전히이 메모리를 다른 프로세스에서 사용하기 위해 해제하지 않을 것입니다 (그러나 원래 프로세스 내에서 추가 재 할당에 사용될 수 있음). 일반적으로 이것은 메모리 조각화를 줄이는 데 유용하며 사용되지 않는 프로세스 메모리가 디스크로 페이징 될 때 너무 많은 단점이 없습니다. Windows는 새로운 할당 (작업 관리자에서 볼 수 있음)에서 사용하기 위해 프로세스 메모리를 다시 OS로 릴리스하므로 Windows에서이 메모리를 사용하면 다른 결과가 나타날 수 있습니다.

    결국, 할당 취소 된 프로세스 메모리를 관리하는 방법은 운영 체제의 범위이며, 시스템 정보 도구를 살펴보면 반드시 전체 진실을 말할 필요가없는 다양한 방식 (부작용과 부작용이 있음)이 있습니다. .

  2. ==============================

    2.항목이 사전에서 삭제 된 경우 Python이 사전의 크기를 조정하지 않는다는 것은 맞습니다. 이것은 OS 메모리 관리 및 가비지 콜렉션과 아무 관련이 없으며, 파이썬의 dict 데이터 구조에 대한 구현 세부 사항입니다.

    항목이 사전에서 삭제 된 경우 Python이 사전의 크기를 조정하지 않는다는 것은 맞습니다. 이것은 OS 메모리 관리 및 가비지 콜렉션과 아무 관련이 없으며, 파이썬의 dict 데이터 구조에 대한 구현 세부 사항입니다.

    해결 방법은 이전 사전을 복사하여 새 사전을 만드는 것입니다. 자세한 정보는 위의 동영상을 확인하십시오. http://pyvideo.org/video/276/the-mighty-dictionary-55 (26:30 경 대답이 있습니다).

  3. from https://stackoverflow.com/questions/3935675/python-reclaiming-memory-after-deleting-items-in-a-dictionary by cc-by-sa and MIT license