迹忆客 专注技术分享

当前位置:主页 > 学无止境 > 编程语言 > Python >

Python 中的内存泄漏

作者:迹忆客 最近更新:2023/07/02 浏览次数:

内存泄漏是一个常见的编程问题,很难调试和修复。

本文将通过小型和大型示例程序探讨 Python 内存泄漏。 我们将了解如何找到内存泄漏的根源以及如何修复它。


Python 中的内存泄漏

在本文中我们不会讨论 Python 内存管理系统的内部结构。 但是,如果你对Python内存系统是如何工作的感到好奇,你可以参考Python标准库的源代码和其他高级编程语言的代码。

现在,让我们讨论一些我们将在示例中使用的库来研究 Python 中的内存泄漏。 第一个库是 Requests 库,它允许我们向特定 URL 发出 HTTP 请求。

在继续使用这些技术(无论是 REST API 还是 Web Scraping)之前,必须先了解请求。 当请求发送到 URL 时会返回响应。

Python 应用程序包含请求和响应的内置管理功能。

我们可以使用以下命令轻松安装它。

# python
pip install requests

一旦我们安装了 requests 库,现在我们将安装 GC 模块。 它使我们能够访问 Python 垃圾收集器。

它具有激活收集器、禁用收集器、调整收集频率、调试等选项。

在 C 和 C++ 等较低级语言中,程序员必须手动释放不再使用的任何资源。 换句话说,开发程序来管理资源。

然而,Python和Java等高级语言包含垃圾收集的概念,即自动内存管理。 垃圾收集负责为程序分配和释放内存。

我们将使用的 GC 模块的方法是 get_object(),该方法从垃圾收集中提供跟踪对象。 我们还将使用 collect() 方法来提供不受收集器控制的列表的非引用对象。


识别 Python 中的内存泄漏

现在,我们将讨论如何识别运行程序时是否存在内存泄漏。 让我们从一个例子开始,使用上面提到的库来检查是否存在泄漏。

我们将首先导入本示例前面提到的库。

# python
import requests
import gc

然后我们将定义一个函数 getGoogle(),它将使用 Requests 库请求 google.com 的响应并返回收到的状态代码。

代码:

# python
def getGoogle():
    resultGot = requests.get('https://google.com')
    print("Status Code recieved is ", resultGot.status_code)
    return

现在我们将定义另一个函数 checkMemoryLeak(),在该函数中我们将在调用函数 getGoogle() 之前和之后收集垃圾对象。

代码:

# python
def checkMemoryLeak():
    print("Memory Leaked before calling getGoogle()")
    print(len( gc.get_objects() ) )
    getGoogle()
    print("Memory Leaked before calling getGoogle()")
    print(len( gc.get_objects() ) )
checkMemoryLeak()

输出:

Python 请求时内存泄漏

正如您在示例中看到的,在调用该函数之前,垃圾收集器的长度为17472,而在调用我们的函数之后,长度增加到17698。这表明在执行某些任务时总是存在内存泄漏。

我们现在将讨论如何修复内存泄漏并在不发生内存泄漏的情况下收集尽可能多的数据。


修复 Python 中的内存泄漏

我们可以使用函数 gc.collect() 修复 Python 中的内存泄漏。 我们将使用相同的程序,但对其进行修改,以便不存在或最小化内存泄漏。

在这个例子中,在调用函数 getGoogle() 后,我们将直接调用 gc.collect(),这将减少内存泄漏并解决问题。

代码:

# python
import requests
import gc

def getGoogle():
    resultGot = requests.get('https://google.com')
    print("Status Code recieved is ", resultGot.status_code)

def checkMemoryLeak():
    print("Memory Leaked before calling getGoogle()")
    print(len( gc.get_objects() ) )
    getGoogle()
    gc.collect()
    print("Memory Leaked before calling getGoogle()")
    print(len( gc.get_objects() ) )

checkMemoryLeak()

输出:

Python 中请求时修复内存泄漏

正如您在示例中看到的,使用 gc.collect() 后内存泄漏的数量减少了。 所以这样我们就可以防止函数调用过程中的内存泄漏。

转载请发邮件至 1244347461@qq.com 进行申请,经作者同意之后,转载请以链接形式注明出处

本文地址:

相关文章

Pandas read_csv()函数

发布时间:2024/04/24 浏览次数:254 分类:Python

Pandas read_csv()函数将指定的逗号分隔值(csv)文件读取到 DataFrame 中。

Pandas 追加数据到 CSV 中

发布时间:2024/04/24 浏览次数:352 分类:Python

本教程演示了如何在追加模式下使用 to_csv()向现有的 CSV 文件添加数据。

Pandas 多列合并

发布时间:2024/04/24 浏览次数:628 分类:Python

本教程介绍了如何在 Pandas 中使用 DataFrame.merge()方法合并两个 DataFrames。

Pandas loc vs iloc

发布时间:2024/04/24 浏览次数:837 分类:Python

本教程介绍了如何使用 Python 中的 loc 和 iloc 从 Pandas DataFrame 中过滤数据。

扫一扫阅读全部技术教程

社交账号
  • https://www.github.com/onmpw
  • qq:1244347461

最新推荐

教程更新

热门标签

扫码一下
查看教程更方便