Memray — это профилировщик памяти для Python. Он может отслеживать распределение памяти в коде Python, в собственных модулях расширения и в самом интерпретаторе Python. Он может генерировать несколько различных типов отчетов, которые помогут вам проанализировать собранные данные об использовании памяти. Хотя он обычно используется в качестве инструмента CLI, его также можно использовать в качестве библиотеки для выполнения более детальных задач профилирования.
Примечательные особенности:
Memray может помочь решить следующие проблемы:
Примечание. Memray работает только в Linux и MacOS и не может быть установлен на других платформах.
Мы постоянно ждем отзывов от нашего замечательного сообщества ❤️. Если вы использовали Memray для решения проблемы, профилирования приложения, обнаружения утечки памяти или чего-то еще, сообщите нам об этом! Мы хотели бы услышать о вашем опыте и о том, как Memray вам помог.
Пожалуйста, рассмотрите возможность написать свою историю на странице обсуждения «Истории успеха».
Это действительно имеет значение!
Для Memray требуется Python 3.7+, и его можно легко установить с помощью большинства распространенных инструментов упаковки Python. Мы рекомендуем установить последнюю стабильную версию PyPI с помощью pip:
python3 -m pip install memray
Обратите внимание, что Memray содержит расширение C, поэтому выпуски распространяются как двоичные диски, так и исходный код. Если двоичное колесо недоступно для вашей системы (Linux x86/x64 или macOS), вам необходимо убедиться, что все зависимости удовлетворяются в системе, в которой вы выполняете установку.
Если вы хотите собрать Memray из исходного кода, вам потребуются следующие двоичные зависимости в вашей системе:
Узнайте в диспетчере пакетов, как установить эти зависимости (например apt-get install build-essential python3-dev libdebuginfod-dev libunwind-dev liblz4-dev
в системах на базе Debian или brew install lz4
в MacOS). Обратите внимание, что вам может потребоваться сообщить компилятору, где найти файлы заголовков и библиотек зависимостей. Например, в MacOS с brew
вам может потребоваться запустить:
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 в виртуальной среде в режиме разработки ( -e
последней команды pip install
).
Если вы планируете внести свой вклад в ответ, вам следует установить хуки предварительной фиксации:
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
Чтобы использовать Memray поверх скрипта или одного файла Python, вы можете использовать:
python3 -m memray run my_script.py
Если вы обычно запускаете свое приложение с помощью python3 -m my_module
, вы можете использовать флаг -m
при memray run
:
python3 -m memray run -m my_module
Вы также можете вызвать Memray как инструмент командной строки без необходимости использовать -m
для вызова его как модуля:
memray run my_script.py
memray run -m my_module
Результатом будет двоичный файл (например, memray-my_script.2369.bin
), который вы можете проанализировать разными способами. Один из способов — использовать команду memray flamegraph
для создания графика пламени:
memray flamegraph my_script.2369.bin
В результате будет создан HTML-файл с графиком использования памяти, который вы сможете проверить с помощью своего любимого браузера. Существует множество других генераторов отчетов, которые вы можете использовать для создания других типов отчетов: некоторые из них генерируют выходные данные на терминале, а некоторые — HTML-файлы. Вот пример флеймографа Memray:
Если вам нужен простой и удобный способ использовать 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 поддерживает отслеживание собственных функций C/C++, а также функций Python. Это может быть особенно полезно при профилировании приложений, имеющих расширения C (например, numpy
или pandas
), поскольку это дает целостное представление о том, сколько памяти выделяется расширением и сколько выделяется самим Python.
Чтобы активировать собственное отслеживание, вам необходимо указать аргумент --native
при использовании подкоманды run
:
memray run --native my_script.py
Это автоматически добавит собственную информацию в файл результатов, и она будет автоматически использоваться любым генератором отчетов (например, генераторами отчетов Flamegraph или Table). Это означает, что вместо того, чтобы видеть это на графиках пламени:
Теперь вы сможете увидеть, что происходит внутри вызовов Python:
Репортеры отображают собственные фреймы другим цветом, чем фреймы Python. Их также можно отличить, посмотрев на расположение файла во фрейме (кадры Python обычно создаются из файлов с расширением .py, тогда как собственные фреймы создаются из файлов с расширениями, такими как .c, .cpp или .h).
В режиме реального времени Memray запускает сценарий или модуль в интерфейсе терминала, который позволяет вам в интерактивном режиме проверять использование памяти во время работы. Это полезно для отладки сценариев или модулей, запуск которых занимает много времени или которые имеют несколько сложных шаблонов памяти. Вы можете использовать опцию --live
для запуска скрипта или модуля в режиме реального времени:
memray run --live my_script.py
или если вы хотите выполнить модуль:
memray run --live -m my_module
В вашем терминале отобразится следующий интерфейс TUI:
Результаты отображаются в порядке убывания общего объема памяти, выделенной функцией и вызываемыми ею подфункциями. Вы можете изменить порядок с помощью следующих сочетаний клавиш:
t (по умолчанию): сортировка по общему объему памяти.
o: Сортировка по собственной памяти
a: сортировка по количеству выделений
В большинстве терминалов вы также можете нажать кнопки «Сортировать по итогу», «Сортировать по собственным» и «Сортировать по распределениям» в нижнем колонтитуле.
Заголовок отсортированного столбца подчеркнут.
По умолчанию команда live отображает основной поток программы. Вы можете просмотреть различные потоки программы, нажимая клавиши «больше» и «меньше», <
и >
. В большинстве терминалов вы также можете нажать кнопки «Предыдущая тема» и «Следующая тема» в нижнем колонтитуле.
Помимо отслеживания процессов Python из CLI с помощью memray run
, также можно программно включить отслеживание внутри работающей программы Python.
import memray
with memray . Tracker ( "output_file.bin" ):
print ( "Allocations will be tracked until the with block ends" )
Подробности смотрите в документации API.
Memray имеет лицензию Apache-2.0, как указано в файле LICENSE.
В рамках этого проекта принят Кодекс поведения. Если у вас есть какие-либо сомнения по поводу Кодекса или поведения, с которым вы столкнулись в проекте, свяжитесь с нами по адресу [email protected].
Если вы считаете, что обнаружили уязвимость безопасности в этом проекте, отправьте электронное письмо команде проекта по адресу [email protected] с подробным описанием предполагаемой проблемы и любых найденных вами методов ее воспроизведения.
Пожалуйста, НЕ открывайте проблему в репозитории GitHub, поскольку мы предпочитаем сохранять конфиденциальность отчетов об уязвимостях до тех пор, пока у нас не будет возможности просмотреть и устранить их.
Мы приветствуем ваш вклад, который поможет нам улучшить и расширить этот проект!
Ниже вы найдете некоторые основные шаги, необходимые для внесения вклада в проект. Если у вас есть какие-либо вопросы об этом процессе или любом другом аспекте участия в проекте Bloomberg с открытым исходным кодом, отправьте электронное письмо по адресу [email protected], и мы ответим на ваши вопросы как можно быстрее.
Поскольку этот проект распространяется на условиях лицензии с открытым исходным кодом, вносимые вами вклады лицензируются на тех же условиях. Чтобы мы могли принять ваши материалы, нам потребуется явное подтверждение от вас, что вы можете и желаете предоставить их в соответствии с настоящими условиями, а механизм, который мы используем для этого, называется Сертификатом происхождения разработчика (DCO). . Это очень похоже на процесс, используемый ядром Linux, Samba и многими другими крупными проектами с открытым исходным кодом.
Чтобы участвовать в соответствии с этими условиями, все, что вам нужно сделать, это включить строку, подобную следующей, в качестве последней строки сообщения о фиксации для каждой фиксации в вашем вкладе:
Signed-Off-By: Random J. Developer <[email protected]>
Самый простой способ сделать это — добавить -s
или --signoff
к вашей команде git commit
.
Вы должны использовать свое настоящее имя (извините, никаких псевдонимов и анонимных сообщений).