Python:垃圾收集器是否在引发 MemoryError 之前运行?

2024-03-04

在迭代 30 个涉及内存和 CPU 密集型数值计算的问题序列的 Python 代码中,我观察到 Python 进程的内存消耗在 30 次迭代中每次开始时都会增加约 800MB,并最终引发MemoryError在第 8 次迭代中(系统内存实际上已耗尽)。然而,如果我import gc然后让gc.collect()每次迭代后运行,则内存消耗保持恒定在约 2.5GB,并且 Python 代码在解决所有 30 个问题后很好地终止。该代码只使用了连续2个问题的数据,并且没有引用周期(否则手动垃圾收集也无法降低内存消耗)。

问题

这种行为引发了一个问题:Python 是否尝试在引发垃圾收集器之前运行垃圾收集器?MemoryError。在我看来,这将是一件完全理智的事情,但也许有理由反对这样做?

这里也进行了与上述类似的观察:https://stackoverflow.com/a/4319539/1219479 https://stackoverflow.com/a/4319539/1219479


其实,有are参考周期,这是手册的唯一原因gc.collect()调用完全可以回收内存。

在 Python 中(我假设是 CPython),垃圾收集器的唯一目的是打破引用循环。当不存在时,对象将被销毁,并在最后一次对它们的引用丢失时回收它们的内存。

至于垃圾收集器何时运行,完整的文档在这里:http://docs.python.org/2/library/gc.html http://docs.python.org/2/library/gc.html

最重要的是,Python 维护一个对象分配和释放的内部计数器。每当(allocations - deallocations)达到 700(阈值 0)时,将运行垃圾收集并重置两个计数器。

每次发生收集时(自动或手动运行)gc.collect()),第 0 代(尚未在集合中幸存的所有对象)被收集(即,遍历没有可访问引用的对象,查找引用循环 - 如果找到任何引用循环,则循环将被破坏,可能导致对象被销毁,因为没有留下任何引用)。该集合之后剩余的所有对象都将移至第 1 代。

每 10 次收集(阈值 1),第 1 代也被收集,并且第 1 代中存活的所有对象that移至第 2 代。第 1 代的每 10 个集合(即每 100 个集合 - 阈值 2)也会收集第 2 代。幸存下来的对象留在第 2 代中——没有第 3 代。

这 3 个阈值可以由用户通过调用来设置gc.set_threshold(threshold0, threshold1, threshold2).

这对您的程序意味着什么:

  1. GC 不是 CPython 用来回收内存的机制(引用计数是)。 GC 会破坏“死”对象中的引用循环,这可能会导致其中一些对象被销毁。
  2. 不,不能保证 GC 会在MemoryError被提出。
  3. 你有参考周期。尝试摆脱它们。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Python:垃圾收集器是否在引发 MemoryError 之前运行? 的相关文章

  • Pandas set_levels,如何避免标签排序?

    我使用时遇到问题set levels多索引 from io import StringIO txt Name Height Age Metres A 1 25 B 95 1 df pd read csv StringIO txt heade
  • Gunicorn 工作人员无论如何都会超时

    我正在尝试通过gunicorn运行一个简单的烧瓶应用程序 但是无论我做什么 我的工作人员都会超时 无论是否有针对应用程序的活动 工作人员在我设置任何内容后总是会超时timeout值到 是什么导致它们超时 当我发出请求时 请求成功通过 但工作
  • 我应该使用 Python 双端队列还是列表作为堆栈? [复制]

    这个问题在这里已经有答案了 我想要一个可以用作堆栈的 Python 对象 使用双端队列还是列表更好 元素数量较少还是数量较多有什么区别 您的情况可能会根据您的应用程序和具体用例而有所不同 但在一般情况下 列表非常适合堆栈 append is
  • 嵌套列表的重叠会产生不必要的间隙

    我有一个包含三个列表的嵌套 这些列表由 for 循环填充 并且填充由 if 条件控制 第一次迭代后 它可能类似于以下示例 a 1 2 0 0 0 0 0 0 4 5 0 0 0 0 0 0 6 7 根据条件 它们不重叠 在第二次迭代之后 新
  • 如何获取可用系统内存的大小?

    C NET 中是否可以获取系统可用内存的大小 如果是的话怎么办 Use Microsoft VisualBasic Devices ComputerInfo TotalPhysicalMemory http msdn microsoft c
  • 如何从Python中的函数返回多个值? [复制]

    这个问题在这里已经有答案了 如何从Python中的函数返回多个变量 您可以用逗号分隔要返回的值 def get name you code return first name last name 逗号表示它是一个元组 因此您可以用括号将值括
  • python multiprocessing 设置生成进程等待

    是否可以生成一些进程并将生成进程设置为等待生成的进程完成 下面是我用过的一个例子 import multiprocessing import time import sys def daemon p multiprocessing curr
  • 在 Django Admin 中调整字段大小

    在管理上添加或编辑条目时 Django 倾向于填充水平空间 但在某些情况下 当编辑 8 个字符宽的日期字段或 6 或 8 个字符的 CharField 时 这确实是一种空间浪费 字符宽 然后编辑框最多可容纳 15 或 20 个字符 我如何告
  • 从 Powershell 脚本安装 Python

    当以管理员身份从 PowerShell 命令行运行以下命令时 可以在 Windows 11 上成功安装 Python c temp python 3 11 4 amd64 exe quiet InstallAllUsers 0 Instal
  • 导入错误:没有名为flask.ext.login的模块

    我的flask login 模块有问题 我已经成功安装了flask login模块 另外 从命令提示符我可以轻松运行此脚本 不会出现错误 Python 2 7 r27 82525 Jul 4 2010 07 43 08 MSC v 1500
  • 如何将 GAE 中一种 Kind 中的所有实体复制到另一种 Kind 中,而无需显式调用每个属性

    我们如何使用function clone entity 如中所述在 Python 中复制 Google App Engine 数据存储中的实体 而无需在 编译 时知道属性名称 https stackoverflow com question
  • 找到一个数字所属的一组范围

    我有一个 200k 行的数字范围列表 例如开始位置 停止位置 该列表包括除了非重叠的重叠之外的所有类型的重叠 列表看起来像这样 3 5 10 30 15 25 5 15 25 35 我需要找到给定数字所属的范围 并对 100k 个数字重复该
  • 为什么 csv.DictReader 给我一个无属性错误?

    我的 CSV 文件是 200 Service 我放入解释器的代码是 snav csv DictReader open screennavigation csv delimiter print snav fieldnames 200 for
  • Python:Goslate 翻译请求返回“503:服务不可用”[关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我们不允许提出寻求书籍 工具 软件库等推荐的问题 您可以编辑问题 以便用事实和引文来回答 这个问题似乎不是关于主要由程序员使用的特定编程问
  • 制作一份 Python 文档的 PDF 文件

    Python 官方网站提供 PDF 文档下载 但它们是按章节分隔的 我下载了源代码并构建了 PDF 文档 这些文档也是单独的 PDF 我怎么能够从源代码中的 Makefile 构建一个 PDF 文件 我认为这样阅读起来会更方便 如果连接单独
  • Firebase Firestore:获取文档的生成 ID (Python)

    我可以创建一个新文档 带有自动生成的 ID 并存储对其的引用 如下所示 my data key value doc ref db collection u campaigns add my data 我可以像这样访问数据本身 print d
  • 如何使用 Boto3 启动具有 IAM 角色的 EC2 实例?

    我无法弄清楚如何使用指定的 IAM 角色在 Boto3 中启动 EC2 实例 以下是迄今为止我如何成功创建实例的一些示例代码 import boto3 ec2 boto3 resource ec2 region name us west 2
  • 在virtualenv中下载sqlite3

    我正在尝试使用命令创建应用程序python3 manage py startapp webapp但我收到一条错误消息 django core exceptions ImproperlyConfigured 加载时出错 pysqlite2 或
  • 如何将Python3设置为Mac上的默认Python版本?

    有没有办法将 Python 3 8 3 设置为 macOS Catalina 版本 10 15 2 上的默认 Python 版本 我已经完成的步骤 看看它安装在哪里 ls l usr local bin python 我得到的输出是这样的
  • JSON:TypeError:Decimal('34.3')不是JSON可序列化的[重复]

    这个问题在这里已经有答案了 我正在运行一个 SQL 查询 它返回一个小数列表 当我尝试将其转换为 JSON 时 出现类型错误 查询 res db execute SELECT CAST SUM r SalesVolume 1000 0 AS

随机推荐