파이썬 응용 프로그램의 메모리 사용량을 알고 싶습니다. 특히 대부분의 메모리를 소비하는 코드 블록 / 부분 또는 객체가 무엇인지 알고 싶습니다. 구글 검색에 따르면 상용 제품은 Python Memory Validator (Windows 만 해당)입니다.
나는 아무도 시도하지 않았으므로 가장 고려할 사항을 알고 싶었습니다.
대부분의 세부 사항을 제공합니다.
코드를 최소한으로 변경하거나 변경하지 않아야합니다.
파이썬 응용 프로그램의 메모리 사용량을 알고 싶습니다. 특히 대부분의 메모리를 소비하는 코드 블록 / 부분 또는 객체가 무엇인지 알고 싶습니다. 구글 검색에 따르면 상용 제품은 Python Memory Validator (Windows 만 해당)입니다.
나는 아무도 시도하지 않았으므로 가장 고려할 사항을 알고 싶었습니다.
대부분의 세부 사항을 제공합니다.
코드를 최소한으로 변경하거나 변경하지 않아야합니다.
답변:
Heapy 는 사용하기가 매우 쉽습니다 . 코드의 어느 시점에서 다음을 작성해야합니다.
from guppy import hpy
h = hpy()
print(h.heap())
이것은 다음과 같은 출력을 제공합니다.
Partition of a set of 132527 objects. Total size = 8301532 bytes.
Index Count % Size % Cumulative % Kind (class / dict of class)
0 35144 27 2140412 26 2140412 26 str
1 38397 29 1309020 16 3449432 42 tuple
2 530 0 739856 9 4189288 50 dict (no owner)
또한 객체가 참조되는 위치를 찾아서 이에 대한 통계를 얻을 수 있지만 그에 대한 문서는 약간 드문 경우입니다.
Tk로 작성된 그래픽 브라우저도 있습니다.
pip install https://guppy-pe.svn.sourceforge.net/svnroot/guppy-pe/trunk/guppy
boost::python객체 를 포함하기 위해 힙을 얻는 메커니즘을 개발했다면 몇 가지 예를 보는 것이 좋습니다!
아무도 언급하지 않았으므로 내 모듈 memory_profiler를 가리킬 것입니다. 메모리 사용량에 대한 라인 단위 보고서를 인쇄 할 수 있고 Unix 및 Windows에서 작동하는 를 가리킬 것입니다 (이 마지막 파일에는 psutil이 필요합니다). 결과는 매우 상세하지 않지만 목표는 코드가 더 많은 메모리를 소비하는 위치에 대한 개요를 제공하고 할당 된 객체에 대한 철저한 분석은 제공하지 않는 것입니다.
함수를 장식 @profile하고 -m memory_profiler플래그로 코드를 실행 하면 다음과 같이 한 줄씩 보고서가 인쇄됩니다.
Line # Mem usage Increment Line Contents
==============================================
3 @profile
4 5.97 MB 0.00 MB def my_func():
5 13.61 MB 7.64 MB a = [1] * (10 ** 6)
6 166.20 MB 152.59 MB b = [2] * (2 * 10 ** 7)
7 13.61 MB -152.59 MB del b
8 13.61 MB 0.00 MB return a
memory_profiler출력을 버퍼링합니까 ? 뭔가 잘못하고있을 수도 있지만 함수가 완료되면 함수에 대한 프로파일을 덤프하는 대신 스크립트가 끝날 때까지 기다리는 것 같습니다.
다우 저를 추천 합니다. 설정이 매우 쉽고 코드를 전혀 변경하지 않아도됩니다. 간단한 웹 인터페이스에서 시간을 통해 각 유형의 개체 수를보고, 라이브 개체 목록을보고, 라이브 개체에 대한 참조를 볼 수 있습니다.
# memdebug.py
import cherrypy
import dowser
def start(port):
cherrypy.tree.mount(dowser.Root())
cherrypy.config.update({
'environment': 'embedded',
'server.socket_port': port
})
cherrypy.server.quickstart()
cherrypy.engine.start(blocking=False)
memdebug를 가져오고 memdebug.start를 호출하십시오. 그게 다야.
PySizer 또는 Heapy를 시도하지 않았습니다. 다른 사람들의 리뷰에 감사드립니다.
최신 정보
위의 코드입니다 CherryPy 2.X, 방법은 제거하고 하지 않습니다 플래그. 그래서 당신이 사용하는 경우CherryPy 3.Xserver.quickstartengine.startblockingCherryPy 3.X
# memdebug.py
import cherrypy
import dowser
def start(port):
cherrypy.tree.mount(dowser.Root())
cherrypy.config.update({
'environment': 'embedded',
'server.socket_port': port
})
cherrypy.engine.start()
objgraph 라이브러리를 고려하십시오 (참조사용 사례의 예는 http://www.lshift.net/blog/2008/11/14/tracing-python-memory-leaks ).
objgraph.by_type('dict')예기치 않은 모든 dict객체 의 출처를 이해하는 것과 같은 일을 할 수 있습니다 .
memprof라는 Python 용 메모리 프로파일 러를 개발 중입니다.
http://jmdana.github.io/memprof/
데코 레이팅 된 메소드를 실행하는 동안 변수의 메모리 사용량을 기록하고 플로팅 할 수 있습니다. 다음을 사용하여 라이브러리를 가져와야합니다.
from memprof import memprof
다음을 사용하여 메소드를 장식하십시오.
@memprof
이것은 플롯이 어떻게 보이는지에 대한 예입니다.

이 프로젝트는 GitHub에서 호스팅됩니다 :
a, b및 c변수의 이름입니다. github.com/jmdana/memprof 에서 설명서를 찾을 수 있습니다 . 질문이 있으시면 언제든지 github에 문제를 제출하거나 문서에서 찾을 수있는 메일 링리스트로 이메일을 보내십시오.
pytracemalloc 프로젝트 도 시도하십시오Python 줄 번호 당 메모리 사용량을 제공 .
편집 (2014/04) : 이제 스냅 샷을 분석 할 수있는 Qt GUI가 있습니다.
tracemalloc이제 파이썬 표준 라이브러리의 일부입니다. 참조 docs.python.org/3/library/tracemalloc.html