我们正在寻找Python应用程序中的内存泄漏

哇! 我们将继续发布一系列出版物,专门介绍“ Python中的Web开发人员”课程的发布,现在,我们正在与您分享另一篇有趣的文章的翻译。

在Zendesk,我们使用Python创建机器学习产品。 在机器学习应用程序中,我们遇到的最常见问题之一是内存泄漏和峰值。 通常,使用分布式处理框架(例如HadoopSparkAWS Batch)在容器中执行Python代码。 每个容器分配有固定数量的内存。 一旦代码执行超过指定的内存限制,容器将由于由于内存不足而发生的错误而停止工作。



您可以通过分配更多的内存来快速解决此问题。 但是,由于不可预测的内存突发,这可能导致资源浪费并影响应用程序的稳定性。 内存泄漏的原因可能如下

  • 长时间存储未删除的大型对象;
  • 代码中的环回链接
  • 基础C库/扩展导致内存泄漏;

优良作法是通过应用程序分析内存使用情况,以更好地了解代码空间和使用的包的效率。

本文讨论了以下方面:

  • 随时间推移分析应用程序内存使用情况;
  • 如何检查程序特定部分的内存使用情况;
  • 由内存问题引起的调试错误的提示。

随着时间的推移进行内存分析

您可以使用memory-profiler包查看执行Python程序期间的可变内存使用情况。

# install the required packages pip install memory_profiler pip install matplotlib # run the profiler to record the memory usage # sample 0.1s by defaut mprof run --include-children python fantastic_model_building_code.py # plot the recorded memory usage mprof plot --output memory-profile.png 



图A.内存分析与时间的关系

include-children选项将启用父进程产生的任何子进程的内存使用。 图A反映了迭代学习过程,该过程导致内存在处理训练数据包的那一刻以周期增加。 在垃圾回收期间删除对象。

如果内存使用量不断增加,则认为这是内存泄漏的潜在威胁。 是一个反映此情况的示例代码:


图B.内存使用量随时间增加

一旦内存使用超过特定阈值,就应该在调试器中设置断点。 为此,您可以使用pdb-mmem参数 ,这在故障排除期间很方便。

在特定时间点的内存转储

估计程序中大对象的预期数量以及是否应复制和/或将其转换为各种格式非常有用。

为了进一步分析内存中的对象,可以使用muppy在程序的某些行中创建转储堆。

 # install muppy pip install pympler # Add to leaky code within python_script_being_profiled.py from pympler import muppy, summary all_objects = muppy.get_objects() sum1 = summary.summarize(all_objects) # Prints out a summary of the large objects summary.print_(sum1) # Get references to certain types of objects such as dataframe dataframes = [ao for ao in all_objects if isinstance(ao, pd.DataFrame)] for d in dataframes: print d.columns.values print len(d) 


图C.示例转储堆转储

另一个有用的内存配置文件库是objgraph ,它允许您生成图形以检查对象的来源。

有用的指针

一个有用的方法是创建一个小的“测试用例”,该用例运行适当的代码,从而导致内存泄漏。 如果完整的输入将花费很长时间来处理,请考虑使用随机选择的数据的子集。

在单独的过程中执行高内存负载的任务

Python不一定会立即为操作系统释放内存。 为确保已释放内存,必须在执行一段代码后开始一个单独的过程。 您可以在此处了解有关Python中垃圾收集器的更多信息。

调试器可以添加对对象的引用。

如果使用诸如pdb之类的断点调试器,则调试器手动引用的所有创建的对象将保留在内存中。 由于没有及时删除对象,因此会产生错误的内存泄漏感。

注意可能导致内存泄漏的软件包。

Python中的某些库可能会导致泄漏,例如pandas有几个已知的内存泄漏问题。
寻找泄漏的好地方!

有用的链接:

docs.python.org/3/c-api/memory.html
docs.python.org/3/library/debug.html

如果这篇文章对您有用,请在评论中写下。 如果您想进一步了解我们的课程,我们邀请您参加将于4月22日举行的开放日

Source: https://habr.com/ru/post/zh-CN448474/


All Articles