Python 中释放内存

2023-12-05

我有一些关于以下示例中内存使用情况的相关问题。

  1. 如果我在解释器中运行,

    foo = ['bar' for _ in xrange(10000000)]
    

    我的机器上使用的实际内存达到80.9mb。然后我,

    del foo
    

    真实记忆力下降,但仅限于30.4mb。解释器使用4.4mb基线那么不释放有什么好处26mb操作系统的内存?是不是因为Python“未雨绸缪”,认为可能会再次使用那么多内存?

  2. 为什么会释放50.5mb特别是 - 释放的数量是多少?

  3. 有没有办法强制Python释放所有已使用的内存(如果你知道你不会再使用那么多内存)?

NOTE这个问题不同于如何在 Python 中显式释放内存?因为这个问题主要涉及即使解释器通过垃圾收集释放对象(使用gc.collect或不)。


我猜您真正关心的问题是:

有没有办法强制Python释放所有已使用的内存(如果你知道你不会再使用那么多内存)?

不,那里没有。但有一个简单的解决方法:子进程。

如果您需要 500MB 的临时存储 5 分钟,但之后您需要再运行 2 小时并且不会再接触那么多内存,请生成一个子进程来执行内存密集型工作。当子进程消失时,内存被释放。

这并不完全是微不足道和免费的,但它非常简单且便宜,这通常足以让交易变得值得。

首先,创建子进程的最简单方法是concurrent.futures(或者,对于 3.1 及更早版本,futuresPyPI 上的向后移植):

with concurrent.futures.ProcessPoolExecutor(max_workers=1) as executor:
    result = executor.submit(func, *args, **kwargs).result()

如果您需要更多控制,请使用multiprocessing module.

费用为:

  • 在某些平台上,尤其是 Windows,进程启动有点慢。我们这里谈论的是毫秒,而不是分钟,如果你让一个孩子完成 300 秒的工作,你甚至不会注意到它。但它不是免费的。
  • 如果您使用的大量临时内存确实是large,这样做可能会导致您的主程序被换出。当然,从长远来看,您可以节省时间,因为如果该内存永远挂起,则必然会导致在某个时刻进行交换。但在某些用例中,这可能会将逐渐缓慢变成非常明显的一次性(和早期)延迟。
  • 在进程之间发送大量数据可能会很慢。同样,如果您正在谈论发送超过 2K 的参数并返回 64K 的结果,您甚至不会注意到它,但如果您正在发送和接收大量数据,您将需要使用其他机制(一份文件,mmapped 或其他方式;中的共享内存 APImultiprocessing; etc.).
  • 在进程之间发送大量数据意味着数据必须是可腌制的(或者,如果将它们保存在文件或共享内存中,struct- 能够或理想ctypes-able).
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Python 中释放内存 的相关文章

随机推荐

  • as3 文本字段更改字符串值

    我是Flash中as3的新手 我需要显示警报 在警报框中显示的文本字段如下 ou ra ro la atio hata 但我想显示的真实文本就像 鼠标拖放播放动作哈塔 在代码对中 文本字段类似于 鼠标拖放播放动作哈塔 当我调试代码时 我也看
  • UIWebView 仍然存在于 Google 移动广告中

    我正在尝试为 IOS 构建 但上传到 ITuneconnect 后收到此消息 ITMS 90809 已弃用的 API 使用 不再接受使用 UIWebView 的新应用程序 相反 使用 WKWebView 可以提高安全性和可靠性 了解更多 h
  • Google App Engine 中的进度条

    我有一个 Google App Engine 应用程序 它对远程 API 执行大约 30 50 次调用 每次调用大约需要一秒钟 因此整个操作很容易需要一分钟 目前 我在站点的 post 函数内循环执行此操作 因此在整个操作完成之前不会打印响
  • Visual Studio 2010 中缺少 asp.net Web 应用程序模板

    我安装了 Visual Studio 2010 终极版 当我单击 新建项目 gt Visual Basic 或 C gt Web 时 我得到的唯一选项是 AjaxControlExtender AjaxServerControl 和 ASP
  • Java“虚拟机”与Python“解释器”的说法?

    似乎很少读到 Python 虚拟机 而在 Java 中却一直使用 虚拟机 两者都解释字节码 为什么称一个为虚拟机而另一个为解释器 在本文中 虚拟机 指的是进程虚拟机 而不是指 系统虚拟机 例如 Qemu 或 Virtualbox 进程虚拟机
  • 在 HTML 中为 target="_blank" 打开新窗口

    a href facebook com sharer target blank Share this a 当用户单击它时 如何在新窗口中使其具有一定的宽度和高度 在firefox中 当前代码仅打开一个新选项卡 而不是新窗口 要在包含尺寸和所
  • 如何在 ibm worklight 中打开本机相机

    Ibm Worklight 有调用本机应用程序的示例 但它是在 worklight 本身中创建的 例如 此示例中的 module 09 1 Android CombiningNativeAndWebPages 在 android 文件夹本身
  • 是否可以从另一个容器启动已停止的容器

    有两个容器A和B 一旦容器A启动 就会执行一个进程 然后容器就会停止 容器 B 只是一个 Web 应用程序 比如expressjs 是否可以从容器 B 启动 A 可以授予容器对 docker 的访问权限 以便它可以在主机上生成其他容器 您可
  • awk 命令接受两个变量作为参数并返回一个值

    我有一个有 50 行的文件 每行由三列组成 前两列是变量 这将作为参数传递以返回第三列的值 对于前 command file txt 是文件 它包含 A B 10 C D 20 E F 30 G H 50 I J 70 我有一个包含以下命令
  • Android 共享首选项和数组

    我创建了一个天气小部件 我将其配置存储在SharedPreferences 小部件由服务更新 我将天气信息和天气预报一起保存在一个数组中 晚上手机关机后 我发现数组值消失了 也许系统暂停了 服务 有没有办法将数组存储在SharePrefer
  • 如何使用 NSPredicate 判断 Int 列表是否包含 Int 数字?

    我有一个 Realm 模型Person谁拥有标签属性 let tags List
  • C 编程中的输入重定向?

    我试图将一个名为 data1 的数据文件重定向到我的程序中 但我不断收到segmentation fault 当我尝试时 w data1然后它会正确读取它 但是当我这样做时 w lt data1然后弹出错误 我必须使用第二种方式来完成我的作
  • 将 java.util.Date 转换为 java.sql.Timestamp 结果为错误值

    服务器端代码 服务器时区是 UTC Date aDate new Date java sql Timestamp aTimestamp new java sql Timestamp aDate getTime 客户端 移动应用程序 时区 G
  • IIS 7.5 无法使用代码隐藏文件加载自定义 HTTP 处理程序

    在过去的 2 天里 我试图让我的自定义 HTTP 处理程序正常工作 但没有结果 我收到以下错误 无法加载类型 AlarmHandler 描述 未处理 执行当前 Web 请求期间发生异常 请查看堆栈跟踪以获取有关错误和的更多信息 它起源于代码
  • 如何为 php 启用 mysqlnd?

    我安装并运行了 PHP 版本 5 3 17 我想切换到 mysqlnd 在 phpinfo 中 mysqlnd 根本不存在 我读到为了设置它 您需要更新 configure命令 configure with mysql mysqlnd wi
  • 更改焦点上组合框的边框颜色

    我有一个习惯ComboBox 我想给一个定制BorderColor to the ComboBox 当它聚焦时 为此 我使用以下代码 Graphics g Graphics FromHwnd Handle Rectangle bounds
  • 在 C++ 中,从函数返回向量仍然是不好的做法吗?

    简洁版本 在许多编程语言中 返回大型对象 例如向量 数组 是很常见的 如果类有移动构造函数 这种风格现在在 C 0x 中是否可以接受 或者 C 程序员是否认为它很奇怪 丑陋 令人厌恶 长版 在 C 0x 中 这仍然被认为是不好的形式吗 st
  • 为什么电子邮件客户端需要 SMTP 中继服务器?有必要吗?

    在设置我的移动电子邮件客户端时 我通常需要输入 SMTP 中继服务器域名 但为什么我的电子邮件客户端需要 SMTP 中继服务器呢 我认为它可以通过查找 DNS MX 记录 直接与目标电子邮件地址所在域的 smtpd 服务器 例如 postf
  • 在 MySQL 数据库的每个表的字段中搜索文本

    我想在 MySQL 数据库的所有表的所有字段中搜索给定的字符串 可能使用以下语法 SELECT FROM WHERE LIKE stuff 可以做这样的事情吗 你可以做一个SQLDump数据库 及其数据 的名称 然后搜索该文件
  • Python 中释放内存

    我有一些关于以下示例中内存使用情况的相关问题 如果我在解释器中运行 foo bar for in xrange 10000000 我的机器上使用的实际内存达到80 9mb 然后我 del foo 真实记忆力下降 但仅限于30 4mb 解释器