Memray는 Python용 메모리 프로파일러입니다. Python 코드, 기본 확장 모듈 및 Python 인터프리터 자체에서 메모리 할당을 추적할 수 있습니다. 캡처된 메모리 사용량 데이터를 분석하는 데 도움이 되는 다양한 유형의 보고서를 생성할 수 있습니다. 일반적으로 CLI 도구로 사용되지만 보다 세분화된 프로파일링 작업을 수행하기 위한 라이브러리로도 사용할 수 있습니다.
주목할만한 기능:
Memray는 다음 문제에 도움을 줄 수 있습니다:
참고 Memray는 Linux 및 MacOS에서만 작동하며 다른 플랫폼에는 설치할 수 없습니다.
우리는 멋진 커뮤니티 ❤️에서 지속적으로 피드백을 찾고 있습니다. Memray를 사용하여 문제를 해결하고, 애플리케이션을 프로파일링하고, 메모리 누수 등을 발견했다면 알려주세요! 우리는 귀하의 경험과 Memray가 귀하에게 어떻게 도움이 되었는지 듣고 싶습니다.
성공 사례 토론 페이지에 귀하의 이야기를 작성해 보십시오.
정말 차이가 납니다!
Memray에는 Python 3.7 이상이 필요하며 가장 일반적인 Python 패키징 도구를 사용하여 쉽게 설치할 수 있습니다. pip를 사용하여 PyPI의 최신 안정 릴리스를 설치하는 것이 좋습니다.
python3 -m pip install memray
Memray에는 C 확장이 포함되어 있으므로 릴리스는 소스 코드뿐만 아니라 바이너리 휠로 배포됩니다. 시스템(Linux x86/x64 또는 macOS)에서 바이너리 휠을 사용할 수 없는 경우 설치를 수행하는 시스템에서 모든 종속성이 충족되는지 확인해야 합니다.
소스에서 Memray를 빌드하려면 시스템에 다음과 같은 바이너리 종속성이 필요합니다.
이러한 종속성을 설치하는 방법은 패키지 관리자를 확인하세요(예: Debian 기반 시스템의 경우 apt-get install build-essential python3-dev libdebuginfod-dev libunwind-dev liblz4-dev
또는 MacOS의 경우 brew install lz4
). 종속성의 헤더 및 라이브러리 파일을 찾을 수 있는 위치를 컴파일러에 가르쳐야 할 수도 있습니다. 예를 들어, brew
사용하는 MacOS에서는 다음을 실행해야 할 수 있습니다.
export CFLAGS= " -I $( brew --prefix lz4 ) /include " LDFLAGS= " -L $( brew --prefix lz4 ) /lib -Wl,-rpath, $( brew --prefix lz4 ) /lib "
memray
설치하기 전에. 더 자세한 정보를 보려면 패키지 관리자의 문서를 확인하여 헤더 및 라이브러리 파일의 위치를 알아보세요.
MacOS에서 빌드하는 경우 배포 대상도 설정해야 합니다.
export MACOSX_DEPLOYMENT_TARGET=10.14
바이너리 종속성을 설치한 후에는 저장소를 복제하고 일반적인 빌드 프로세스를 따를 수 있습니다.
git clone [email protected]:bloomberg/memray.git memray
cd memray
python3 -m venv ../memray-env/ # just an example, put this wherever you want
source ../memray-env/bin/activate
python3 -m pip install --upgrade pip
python3 -m pip install -e . -r requirements-test.txt -r requirements-extra.txt
그러면 개발 모드의 가상 환경에 Memray가 설치됩니다(마지막 pip install
명령의 -e
).
다시 기여할 계획이라면 사전 커밋 후크를 설치해야 합니다.
pre-commit install
이렇게 하면 귀하의 기여가 린팅 검사를 통과하게 됩니다.
여기에서 최신 문서를 찾을 수 있습니다.
Memray를 사용하는 방법에는 여러 가지가 있습니다. 가장 쉬운 방법은 이를 명령줄 도구로 사용하여 스크립트, 애플리케이션 또는 라이브러리를 실행하는 것입니다.
usage: memray [-h] [-v] {run,flamegraph,table,live,tree,parse,summary,stats} ...
Memory profiler for Python applications
Run `memray run` to generate a memory profile report, then use a reporter command
such as `memray flamegraph` or `memray table` to convert the results into HTML.
Example:
$ python3 -m memray run -o output.bin my_script.py
$ python3 -m memray flamegraph output.bin
positional arguments:
{run,flamegraph,table,live,tree,parse,summary,stats}
Mode of operation
run Run the specified application and track memory usage
flamegraph Generate an HTML flame graph for peak memory usage
table Generate an HTML table with all records in the peak memory usage
live Remotely monitor allocations in a text-based interface
tree Generate a tree view in the terminal for peak memory usage
parse Debug a results file by parsing and printing each record in it
summary Generate a terminal-based summary report of the functions that allocate most memory
stats Generate high level stats of the memory usage in the terminal
optional arguments:
-h, --help Show this help message and exit
-v, --verbose Increase verbosity. Option is additive and can be specified up to 3 times
-V, --version Displays the current version of Memray
Please submit feedback, ideas, and bug reports by filing a new issue at https://github.com/bloomberg/memray/issues
스크립트나 단일 Python 파일을 통해 Memray를 사용하려면 다음을 사용할 수 있습니다.
python3 -m memray run my_script.py
일반적으로 python3 -m my_module
사용하여 애플리케이션을 실행하는 경우 memray run
과 함께 -m
플래그를 사용할 수 있습니다.
python3 -m memray run -m my_module
-m
사용하여 모듈로 호출하지 않고도 Memray를 명령줄 도구로 호출할 수도 있습니다.
memray run my_script.py
memray run -m my_module
출력은 다양한 방법으로 분석할 수 있는 바이너리 파일(예: memray-my_script.2369.bin
)입니다. 한 가지 방법은 memray flamegraph
명령을 사용하여 Flame 그래프를 생성하는 것입니다.
memray flamegraph my_script.2369.bin
이렇게 하면 즐겨 사용하는 브라우저로 검사할 수 있는 메모리 사용량의 플레임 그래프가 포함된 HTML 파일이 생성됩니다. 다른 유형의 보고서를 생성하는 데 사용할 수 있는 여러 다른 보고자가 있으며, 그 중 일부는 터미널 기반 출력을 생성하고 일부는 HTML 파일을 생성합니다. 다음은 Memray Flamegraph의 예입니다.
테스트 스위트에서 memray
사용하는 쉽고 편리한 방법을 원한다면 pytest-memray 사용을 고려할 수 있습니다. 이 pytest 플러그인을 설치하면 명령줄 호출에 --memray
간단히 추가할 수 있습니다.
pytest --memray tests/
그리고 자동으로 다음과 같은 보고서를 받게 됩니다.
python3 -m pytest tests --memray
=============================================================================================================================== test session starts ================================================================================================================================
platform linux -- Python 3.8.10, pytest-6.2.4, py-1.10.0, pluggy-0.13.1
rootdir: /mypackage, configfile: pytest.ini
plugins: cov-2.12.0, memray-0.1.0
collected 21 items
tests/test_package.py ..................... [100%]
================================================================================================================================= MEMRAY REPORT ==================================================================================================================================
Allocations results for tests/test_package.py::some_test_that_allocates
? Total memory allocated: 24.4MiB
? Total allocations: 33929
Histogram of allocation sizes: |▂ █ |
? Biggest allocating functions:
- parse:/opt/bb/lib/python3.8/ast.py:47 -> 3.0MiB
- parse:/opt/bb/lib/python3.8/ast.py:47 -> 2.3MiB
- _visit:/opt/bb/lib/python3.8/site-packages/astroid/transforms.py:62 -> 576.0KiB
- parse:/opt/bb/lib/python3.8/ast.py:47 -> 517.6KiB
- __init__:/opt/bb/lib/python3.8/site-packages/astroid/node_classes.py:1353 -> 512.0KiB
해당 테스트 실행이 허용된 것보다 더 많은 메모리를 할당하는 경우 포함된 마커 중 일부를 사용하여 테스트가 실패하도록 할 수도 있습니다.
@ pytest . mark . limit_memory ( "24 MB" )
def test_foobar ():
# do some stuff that allocates memory
플러그인을 사용하고 구성하는 방법에 대해 자세히 알아보려면 플러그인 설명서를 확인하세요.
Memray는 Python 함수뿐만 아니라 네이티브 C/C++ 함수 추적도 지원합니다. 이는 C 확장(예: numpy
또는 pandas
)이 있는 애플리케이션을 프로파일링할 때 특히 유용할 수 있습니다. 이는 확장에 의해 할당된 메모리 양과 Python 자체에 의해 할당된 메모리 양에 대한 전체적인 비전을 제공하기 때문입니다.
기본 추적을 활성화하려면 run
하위 명령을 사용할 때 --native
인수를 제공해야 합니다.
memray run --native my_script.py
이렇게 하면 기본 정보가 결과 파일에 자동으로 추가되고 모든 보고자(예: Flamegraph 또는 테이블 보고자)가 자동으로 사용하게 됩니다. 이는 불꽃 그래프에서 이것을 보는 대신 다음을 의미합니다.
이제 Python 호출 내부에서 무슨 일이 일어나고 있는지 확인할 수 있습니다.
Reporter는 Python 프레임과 다른 색상으로 기본 프레임을 표시합니다. 프레임의 파일 위치를 보고 구별할 수도 있습니다(파이썬 프레임은 일반적으로 .py 확장자를 가진 파일에서 생성되는 반면 기본 프레임은 .c, .cpp 또는 .h와 같은 확장자를 가진 파일에서 생성됩니다).
Memray의 라이브 모드는 실행되는 동안 메모리 사용량을 대화형으로 검사할 수 있는 터미널 기반 인터페이스에서 스크립트나 모듈을 실행합니다. 이는 실행하는 데 시간이 오래 걸리거나 여러 복잡한 메모리 패턴을 나타내는 스크립트나 모듈을 디버깅하는 데 유용합니다. --live
옵션을 사용하여 라이브 모드에서 스크립트나 모듈을 실행할 수 있습니다.
memray run --live my_script.py
또는 모듈을 실행하려는 경우:
memray run --live -m my_module
그러면 터미널에 다음 TUI 인터페이스가 표시됩니다.
결과는 함수에 의해 할당된 총 메모리와 해당 함수에 의해 호출된 하위 함수의 내림차순으로 표시됩니다. 다음 키보드 단축키를 사용하여 순서를 변경할 수 있습니다.
t(기본값): 총 메모리를 기준으로 정렬
o: 자신의 기억으로 정렬
a: 할당 횟수별로 정렬
대부분의 터미널에서는 바닥글에 있는 "전체별 정렬", "자체별 정렬" 및 "할당별 정렬" 버튼을 클릭할 수도 있습니다.
정렬된 열의 제목에는 밑줄이 그어져 있습니다.
기본적으로 live 명령은 프로그램의 메인 스레드를 표시합니다. 보다 큼 및 보다 작음 키, <
및 >
를 눌러 프로그램의 다양한 스레드를 볼 수 있습니다. 대부분의 터미널에서는 바닥글에 있는 "이전 스레드" 및 "다음 스레드" 버튼을 클릭할 수도 있습니다.
memray run
사용하여 CLI에서 Python 프로세스를 추적하는 것 외에도 실행 중인 Python 프로그램 내에서 프로그래밍 방식으로 추적을 활성화할 수도 있습니다.
import memray
with memray . Tracker ( "output_file.bin" ):
print ( "Allocations will be tracked until the with block ends" )
자세한 내용은 API 설명서를 참조하세요.
Memray는 LICENSE 파일에 있는 Apache-2.0 라이센스가 있습니다.
이 프로젝트는 행동 강령을 채택했습니다. 본 강령이나 프로젝트에서 경험한 행동에 대해 우려사항이 있는 경우 [email protected]으로 문의해 주세요.
이 프로젝트에서 보안 취약점을 식별했다고 생각되면 의심되는 문제와 이를 재현하기 위해 찾은 방법을 자세히 설명하여 [email protected]으로 프로젝트 팀에 이메일을 보내주십시오.
GitHub 저장소에서 문제를 열지 마십시오. 우리는 취약성 보고서를 검토하고 해결할 기회가 있을 때까지 비공개로 유지하는 것을 선호합니다.
이 프로젝트를 개선하고 확장하는 데 도움이 되는 귀하의 기여를 환영합니다!
아래에서는 프로젝트에 기여하는 데 필요한 몇 가지 기본 단계를 확인할 수 있습니다. 이 프로세스나 Bloomberg 오픈 소스 프로젝트에 기여하는 다른 측면에 대해 질문이 있는 경우 언제든지 [email protected]으로 이메일을 보내 주시면 최대한 빨리 질문에 답변해 드리겠습니다.
이 프로젝트는 오픈 소스 라이선스 조건에 따라 배포되므로 귀하가 기여하는 경우에도 동일한 조건에 따라 라이선스가 부여됩니다. 당사가 귀하의 기여를 수락하려면 귀하가 본 약관에 따라 기여를 제공할 수 있고 제공할 의향이 있다는 명시적인 확인이 필요하며, 이를 위해 당사가 사용하는 메커니즘을 DCO(개발자 원산지 증명서)라고 합니다. . 이는 Linux 커널, Samba 및 기타 여러 주요 오픈 소스 프로젝트에서 사용되는 프로세스와 매우 유사합니다.
이 약관에 참여하려면 기여의 각 커밋에 대한 커밋 메시지의 마지막 줄에 다음과 같은 줄을 포함하기만 하면 됩니다.
Signed-Off-By: Random J. Developer <[email protected]>
이를 수행하는 가장 간단한 방법은 git commit
명령에 -s
또는 --signoff
추가하는 것입니다.
반드시 실명을 사용해야 합니다(죄송합니다. 가명이나 익명 기여는 불가합니다).