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
这将确保您的贡献通过我们的 linting 检查。
您可以在此处找到最新的文档。
使用 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
运行应用程序,则可以将-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 本身分配了多少内存。
要激活本机跟踪,您需要在使用run
子命令时提供--native
参数:
memray run --native my_script.py
这会自动将本机信息添加到结果文件中,并且任何报告器(例如火焰图或表格报告器)都会自动使用它。这意味着不要在火焰图中看到这一点:
您现在可以看到 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命令将呈现程序的主线程。您可以通过按大于键和小于键<
和>
查看程序的不同线程。在大多数终端中,您还可以单击页脚上的“上一个线程”和“下一个线程”按钮。
除了使用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 已获得 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
命令中。
您必须使用您的真实姓名(抱歉,不能使用假名,也不能匿名投稿)。