어떤 Python 메모리 프로파일 러가 권장됩니까? [닫은]


670

파이썬 응용 프로그램의 메모리 사용량을 알고 싶습니다. 특히 대부분의 메모리를 소비하는 코드 블록 / 부분 또는 객체가 무엇인지 알고 싶습니다. 구글 검색에 따르면 상용 제품은 Python Memory Validator (Windows 만 해당)입니다.

오픈 소스는 PySizerHeapy 입니다.

나는 아무도 시도하지 않았으므로 가장 고려할 사항을 알고 싶었습니다.

  1. 대부분의 세부 사항을 제공합니다.

  2. 코드를 최소한으로 변경하거나 변경하지 않아야합니다.


2
누수 원인을 찾으려면 objgraph를 권장합니다.
pi.

9
@MikeiLL 다음과 같은 질문을위한 장소가 있습니다 : 소프트웨어 권장 사항
Poik

2
한 질문을 다른 포럼으로 마이그레이션 할 수있을 정도로 자주 발생합니다.
zabumba

한 가지 팁 : 누군가가 gae를 사용하고 메모리 사용량을 확인하려는 경우 이러한 도구가 아무것도 출력하지 않거나 이벤트가 시작되지 않았기 때문에 큰 두통입니다. 작은 것을 테스트하려면 파일을 분리하기 위해 테스트하려는 기능을 이동하고이 파일을 단독으로 실행하십시오.
alexche8

4
나는 추천 pympler
zzzeek

답변:


288

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로 작성된 그래픽 브라우저도 있습니다.


24
Python 2.7을 사용하는 경우 트렁크 버전이 필요할 수 있습니다. sourceforge.net/tracker/… ,pip install https://guppy-pe.svn.sourceforge.net/svnroot/guppy-pe/trunk/guppy
James Snyder

27
더미가 많은 문서는 좋지 않습니다 ... :하지만 시작하는 데 매우 도움이 블로그 게시물을 발견 smira.ru/wp-content/uploads/2011/08/heapy.html
조 쇼

4
heapy는 python extension에 할당 된 메모리를 포함하지 않습니다. 누구든지 boost::python객체 를 포함하기 위해 힙을 얻는 메커니즘을 개발했다면 몇 가지 예를 보는 것이 좋습니다!
amos

34
2014-07-06 현재, guppy는 Python 3을 지원하지 않습니다.
Quentin Pradet

5
guppy3이라는 파이썬 3을 지원하는 붕어 포크가 있습니다.
David Foster

385

아무도 언급하지 않았으므로 내 모듈 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

1
내 유스 케이스-복잡한 시스템이 아닌 간단한 이미지 조작 스크립트로 커서를 열어 두는 것이 최선의 해결책이었습니다. 코드에 최소한의 함수가 추가되어 매우 간단하게 진행 상황을 파악할 수 있습니다. 빠른 수정에 적합하며 다른 응용 프로그램에도 적합합니다.
driftcatcher

10
memory_profiler가 정말 간단하고 사용하기 쉽다는 것을 알았습니다. 객체 당이 아닌 라인 당 프로파일 링을 수행하고 싶습니다. 작성해 주셔서 감사합니다.
tommy.carstensen

1
@FabianPedregosa dose memory_profiler가 루프를 처리하는 방법, 루프 반복 번호를 식별 할 수 있습니까?
Glen Fletcher

3
라인 별 금액을보고하려고 할 때 암시 적으로 루프를 식별하고 중복 된 라인을 찾습니다. 이 경우 모든 반복의 최대 값을 취합니다.
Fabian Pedregosa 2018 년

1
@FabianPedregosa memory_profiler출력을 버퍼링합니까 ? 뭔가 잘못하고있을 수도 있지만 함수가 완료되면 함수에 대한 프로파일을 덤프하는 대신 스크립트가 끝날 때까지 기다리는 것 같습니다.
Greenstick

80

다우 저를 추천 합니다. 설정이 매우 쉽고 코드를 전혀 변경하지 않아도됩니다. 간단한 웹 인터페이스에서 시간을 통해 각 유형의 개체 수를보고, 라이브 개체 목록을보고, 라이브 개체에 대한 참조를 볼 수 있습니다.

# 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()

3
그러나 그것은 체리 피만을위한 것입니까, sinple 스크립트로 사용하는 방법은 무엇입니까?
Anurag Uniyal

13
CherryPy 용이 아닙니다. CherryPy를 GUI 툴킷으로 생각하십시오.
sanxiyn

1
fwiw, pysizer 페이지 pysizer.8325.orgheapy 를 추천하는 것으로 보입니다. 비슷한 말입니다
Jacob Gabrielson

6
pypi.python.org/pypi/Dozer : 수맥 기사의 일반적인 WSGI 포트 당신은뿐만 아니라 다른 웹 서버와 함께 사용할 수있는 도저라는이
조 쇼

2
cherrypy 3.1에서 cherrypy.server.quickstart ()를 제거 했으므로 cherrypy.engine.start ()를 사용하십시오
MatsLindh

66

objgraph 라이브러리를 고려하십시오 (참조사용 사례의 예는 http://www.lshift.net/blog/2008/11/14/tracing-python-memory-leaks ).


7
objgraph는 오늘 당면한 메모리 누수 문제를 해결하는 데 도움이되었습니다. objgraph.show_growth ()는 특히 유용했습니다
Ngure Nyaga

1
나도 objgraph가 정말 유용하다는 것을 알았습니다. objgraph.by_type('dict')예기치 않은 모든 dict객체 의 출처를 이해하는 것과 같은 일을 할 수 있습니다 .
디노

18

머피 는 파이썬 용 메모리 사용 프로파일 러입니다. 이 도구 세트는 메모리 누수 식별에 중점을 둡니다.

Muppy는 개발자가 Python 응용 프로그램의 메모리 누수를 식별하도록 도와줍니다. 런타임 동안 메모리 사용을 추적하고 누수되는 객체를 식별 할 수 있습니다. 또한 릴리스되지 않은 객체의 소스를 찾을 수있는 도구가 제공됩니다.


13

memprof라는 Python 용 메모리 프로파일 러를 개발 중입니다.

http://jmdana.github.io/memprof/

데코 레이팅 된 메소드를 실행하는 동안 변수의 메모리 사용량을 기록하고 플로팅 할 수 있습니다. 다음을 사용하여 라이브러리를 가져와야합니다.

from memprof import memprof

다음을 사용하여 메소드를 장식하십시오.

@memprof

이것은 플롯이 어떻게 보이는지에 대한 예입니다.

여기에 이미지 설명을 입력하십시오

이 프로젝트는 GitHub에서 호스팅됩니다 :

https://github.com/jmdana/memprof


3
어떻게 사용합니까? A, B, C 란 무엇입니까?
tommy.carstensen

@ tommy.carstensen a, bc변수의 이름입니다. github.com/jmdana/memprof 에서 설명서를 찾을 수 있습니다 . 질문이 있으시면 언제든지 github에 문제를 제출하거나 문서에서 찾을 수있는 메일 링리스트로 이메일을 보내십시오.
jmdana

12

나는 멜리아 가 Heapy 나 PySizer보다 훨씬 더 기능적이라는 것을 알았다. wsgi webapp을 실행하는 경우 Dozer 는 Dowser의 멋진 미들웨어 래퍼입니다.


당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.