문제

내 Python 애플리케이션의 메모리 사용량을 알고 싶고, 특히 어떤 코드 블록/부분 또는 객체가 대부분의 메모리를 소비하는지 알고 싶습니다.Google 검색에 따르면 상업용 제품은 다음과 같습니다. Python 메모리 유효성 검사기 (윈도우에만 해당).

그리고 오픈소스는 파이사이저 그리고 헤비.

나는 누구도 시도하지 않았으므로 어느 것이 가장 좋은지 알고 싶었습니다.

  1. 가장 자세한 내용을 제공합니다.

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

도움이 되었습니까?

해결책

헤비 사용이 매우 간단합니다.코드의 어느 시점에서는 다음을 작성해야 합니다.

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

다른 팁

아무도 언급하지 않았으므로 내 모듈을 가리킬 것입니다. 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

나는 추천한다 다우저.설정이 매우 쉽고 코드를 변경할 필요가 없습니다.간단한 웹 인터페이스를 통해 시간에 따른 각 유형의 개체 수를 보고, 라이브 개체 목록을 보고, 라이브 개체에 대한 참조를 볼 수 있습니다.

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

고려하다 물체 그래프 도서관 (참조 http://www.lshift.net/blog/2008/11/14/tracing-python-memory-leaks 사용 사례의 예).

머피 (또 다른) Python용 메모리 사용량 프로파일러입니다.이 도구 세트의 초점은 메모리 누수 식별에 있습니다.

Muppy는 개발자가 Python 애플리케이션의 메모리 누수를 식별하도록 돕습니다.런타임 중 메모리 사용량을 추적하고 누출되는 개체를 식별할 수 있습니다.또한 공개되지 않은 개체의 소스를 찾을 수 있는 도구도 제공됩니다.

나는 찾았다 멜리아에 Heapy나 PySizer보다 훨씬 더 기능적입니다.wsgi webapp을 실행하고 있다면, 도저 Dowser의 멋진 미들웨어 래퍼입니다.

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

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

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

from memprof import memprof

그리고 다음을 사용하여 방법을 장식하십시오.

@memprof

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

enter image description here

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

https://github.com/jmdana/memprof

또한 시도해보십시오 pytracemalloc 프로젝트 Python 줄 번호당 메모리 사용량을 제공합니다.

편집 (2014/04):이제 스냅샷을 분석할 수 있는 Qt GUI가 있습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top