使用 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文件,如下图所示:
![](https://img.laitimes.com/img/_0nNw4CM6IyYiwiM6ICdiwiI0gTMx81dsQWZ4lmZf1GLlpXazVmcvwFciV2dsQXYtJ3bm9CX9s2RkBnVHFmb1clWvB3MaVnRtp1XlBXe0xCMy81dvRWYoNHLwEzX5xCMx8FesU2cfdGLwMzX0xiRGZkRGZ0Xy9GbvNGLpZTY1EmMZVDUSFTU4VFRR9Fd4VGdsYTMfVmepNHLrJXYtJXZ0F2dvwVZnFWbp1zczV2YvJHctM3cv1Ce-cmbw5CN1gDOxgDMwcjY5QWOyUDZyYzX5IzNzcTM4EzLcdDMyIDMy8CXn9Gbi9CXzV2Zh1WavwVbvNmLvR3YxUjLyM3Lc9CX6MHc0RHaiojIsJye.png)
这是
out-of-memory.svg
看起来的样子:
正如你所看到的,这个节目正是所有的记忆都来自于工艺运行内存不足的时间。这意味着您现在有了减少内存使用量的起点。
此外,如果内存不足,Fil 将始终以退出代码 53 退出,如果您以自动方式运行它,则可以轻松识别内存不足问题。
内存占用太高?
Fil 可以帮助您找出崩溃的程序在哪里分配内存。但它也可以通过测量数据处理程序的峰值使用来帮助您处理非崩溃程序。