gpt4 book ai didi

python - 在 Python 中释放内存

转载 作者:IT老高 更新时间:2023-10-28 21:05:10 29 4
gpt4 key购买 nike

我有几个关于以下示例中的内存使用的相关问题。

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

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

    我的机器上使用的实际内存高达 80.9mb。那我,

    del foo

    实际内存下降,但仅下降到 30.4mb。解释器使用 4.4mb 基线,那么不向操作系统释放 26mb 内存有什么好处?是不是因为 Python 在“提前计划”,认为你可能会再次使用那么多内存?

  2. 为什么要特别放出50.5mb——放出的数量是多少?

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

注意这个问题不同于 How can I explicitly free memory in Python?因为即使在解释器通过垃圾收集(是否使用 gc.collect 释放对象)之后,这个问题主要涉及从基线增加内存使用量。

最佳答案

我猜你在这里真正关心的问题是:

Is there a way to force Python to release all the memory that was used (if you know you won't be using that much memory again)?

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

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

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

首先,创建子进程最简单的方法是使用 concurrent.futures (或者,对于 3.1 及更早版本,PyPI 上的 futures 反向端口):

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

如果您需要更多控制,请使用 multiprocessing模块。

费用为:

  • 在某些平台(尤其是 Windows)上,进程启动有点慢。我们在这里说的是毫秒,而不是分钟,如果你让一个 child 做 300 秒的工作,你甚至不会注意到它。但它不是免费的。
  • 如果您使用的大量临时内存确实很大,那么这样做可能会导致您的主程序被换出。当然,从长远来看,您可以节省时间,因为如果该内存永远存在,它将不得不在某个时候导致交换。但这会在某些用例中将逐渐的缓慢转变为非常明显的一次性(和早期)延迟。
  • 在进程之间发送大量数据可能会很慢。同样,如果您正在谈论发送超过 2K 的参数并返回 64K 的结果,您甚至不会注意到它,但如果您正在发送和接收大量数据,您将需要使用其他一些机制(一个文件,mmapped 或其他;multiprocessing 中的共享内存 API;等等)。
  • 在进程之间发送大量数据意味着数据必须是可腌制的(或者,如果您将它们粘贴到文件或共享内存中,struct-able 或理想情况下是 ctypes-能够)。

关于python - 在 Python 中释放内存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15455048/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com