Python 中的内存泄漏
内存泄漏是一个常见的编程问题,很难调试和修复。
本文将通过小型和大型示例程序探讨 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()
输出:
正如您在示例中看到的,在调用该函数之前,垃圾收集器的长度为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()
输出:
正如您在示例中看到的,使用 gc.collect()
后内存泄漏的数量减少了。 所以这样我们就可以防止函数调用过程中的内存泄漏。
相关文章
Python 中的 Locust
发布时间:2023/07/02 浏览次数:89 分类:Python
-
我们将通过一个例子来介绍Python中的 locust。Python 中的 locust Locust 用于 Python 中的负载测试。 它是一个非常有用且最好的 Python 负载测试工具。
使用 Python 创建自动点击器
发布时间:2023/07/02 浏览次数:63 分类:Python
-
本篇文章将介绍在 Python 中创建自动答题器的不同方法。使用 pyautogui 模块在 Python 中创建自动点击器
Python 中的 Trie 实现
发布时间:2023/06/30 浏览次数:152 分类:Python
-
尝试是我们用来存储字符串的数据结构。 它们使我们能够以最有效的方式搜索文本字符串。本文将讨论如何在 Python 中实现 Trie。Python 中的 Trie 数据结构
Python Apriori 算法
发布时间:2023/06/30 浏览次数:184 分类:Python
-
Apriori 算法指出,如果一个项集是频繁的,那么它的所有非空子集也必须是频繁的。 本篇文章展示了如何使用 Python 中的 apyori 模块逻辑来实现这一点。
在 Python 中创建键盘记录器
发布时间:2023/06/30 浏览次数:189 分类:Python
-
在Python中,我们可以读取用户输入并检测键盘和鼠标等硬件设备来开发交互式应用程序。 特别是,pynput 模块允许我们使用此类设备并使用函数检测按键和光标移动。本篇文章将介绍如何在 Py
检查Python中的变量是否为字符串
发布时间:2023/06/30 浏览次数:139 分类:Python
-
我们将通过示例介绍两种不同的方法来检查 Python 中的变量是否为字符串。检查Python中的变量是否为字符串 在 Python 中,每个变量都有一个数据类型。 数据类型表示变量内部存储的数据类型。
在 Python 中安装 YAML
发布时间:2023/06/30 浏览次数:123 分类:Python
-
我们将介绍 Python 中的 YAML。 我们还将介绍如何在不同设备上安装 YAML。Python 中的 YAML YAML 是一种序列化语言。
下载 Python 中的 Anaconda
发布时间:2023/06/30 浏览次数:60 分类:Python
-
本文将介绍 Anaconda 以及我们可以在 Python 中下载的不同版本。Python 中的 Anaconda Anaconda 是 Python 科学数据的来源。
使用 Python 截屏
发布时间:2023/06/30 浏览次数:169 分类:Python
-
本文将引导您完成使用 Python 截取屏幕截图必须遵循的所有步骤。 让我们开始!使用 Pyautogui 模块使用 Python 进行屏幕截图第一种方法使用 Python 提供的 pyauotgui 模块。