0
点赞
收藏
分享

微信扫一扫

使用 filprofiler 分析器调试 Python 内存不足崩溃


使用 Fil 检测程序的内存使用量


运行你的 Python 程序,它崩溃了——它的内存不足。这只是​​您的程序在内存不足情况下可能失败​​​的​​多种方式​​之一。

你怎么知道是什么用完了你的程序的所有内存?

一种方法是使用开源 Fil 内存分析器,它专门支持调试内存不足崩溃。 让我们看看如何使用它。

一个例子

考虑以下 Python 程序:



import numpy as np

ALLOCATIONS = []


def add1(x):
ALLOCATIONS.append(np.ones((1024 * 1024 * x)))


def add2():
add1(5)
add1(2)


def main():
while True:
add2()
add1(3)
x = np.ones((1024 * 1024,))


if __name__ == '__main__':
main()



当我运行这个程序时,进程被 Linux 内存不足杀手杀死。不打印回溯。



$ python oom.py
Killed



现在,在这种情况下,程序足够简单,您可以通过读取它来找出内存泄漏,但真正的程序不会那么容易。所以你想要的是一个帮助你调试情况的工具,一个像 Fil 内存分析器这样的工具。

使用 Fil 内存分析器

为了帮助您调试内存不足的崩溃,​​Fil 内存分析器​​支持在崩溃时转储当前的内存分配。事实上,它会尽最大努力及早发现问题,在您的计算机大幅减速或您的进程被操作系统杀死之前。

让我们看看你如何使用 Fil 来调试它。

首先,在 virtualenv 中使用 pip 安装 Fil(目前仅适用于 Linux 和 macOS):



$ pip install --upgrade pip
$ pip install filprofiler



确保您使用的是 v0.14.1 或更高版本,因为这包括改进的内存不足检测。

接下来,我们在 filprofiler 下运行程序。filprofiler 检测内存不足情况并写出一份报告,说明进行了哪些内存分配导致内存不足:



$ fil-profile run oom.py 
...
=fil-profile= Wrote memory usage flamegraph to fil-result/2020-06-15T12:37:13.033/out-of-memory.svg
=fil-profile= Wrote memory usage flamegraph to fil-result/2020-06-15T12:37:13.033/out-of-memory-reversed.svg

filprofiler 会在当前文件夹下面生成一个fil-result文件夹,在里面会有一个以时间命名的文件夹,文件夹中会有两个svg文件,如下图所示: 

使用 filprofiler 分析器调试 Python 内存不足崩溃_内存分析



这是​​out-of-memory.svg​​看起来的样子:

使用 filprofiler 分析器调试 Python 内存不足崩溃_内存分析_02

正如你所看到的,这个节目正是所有的记忆都来自于工艺运行内存不足的时间。这意味着您现在有了减少内存使用量的起点。

此外,如果内存不足,Fil 将始终以退出代码 53 退出,如果您以自动方式运行它,则可以轻松识别内存不足问题。

内存占用太高?

Fil 可以帮助您找出崩溃的程序在哪里分配内存。但它也可以通过测量​​数据处理程序的峰值使用来​​​帮助您处理非崩溃​​程序​​。

一旦您测量了内存使用量并知道它的来源,您就可以开始应用各种​​技术来减少内存使用量​​。


了解更多减少内存使用的技术——阅读​​Python​​​的​​更大内存数据集指南​​的其余部分。

举报

相关推荐

0 条评论