파이썬 응용 프로그램의 메모리 사용량을 알고 싶습니다. 특히 대부분의 메모리를 소비하는 코드 블록 / 부분 또는 객체가 무엇인지 알고 싶습니다. 구글 검색에 따르면 상용 제품은 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.X
server.quickstart
engine.start
blocking
CherryPy 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