相关疑难解决方法(0)

在Python中释放内存

在下面的示例中,我有一些关于内存使用的相关问题.

  1. 如果我在翻译中跑,

    foo = ['bar' for _ in xrange(10000000)]
    
    Run Code Online (Sandbox Code Playgroud)

    我机器上使用的真实内存最多80.9mb.然后,我

    del foo
    
    Run Code Online (Sandbox Code Playgroud)

    真正的记忆力下降,但仅限于30.4mb.解释器使用4.4mb基线,那么不26mb向OS 释放内存的优势是什么?是因为Python"提前规划",认为你可能会再次使用那么多内存吗?

  2. 为什么它会50.5mb特别释放- 基于此发布的金额是多少?

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

注意 这个问题不同于我如何在Python中明确释放内存? 因为这个问题主要处理从基线增加内存使用量,即使在解释器通过垃圾收集(使用gc.collect或不使用)释放对象之后.

python memory-management

122
推荐指数
4
解决办法
12万
查看次数

调试 CPython 内存碎片

我有一个长期运行的 CPython 3.8 进程。过了一会儿,它使用了大量的 RAM。我试过了

  1. 运行 gc.collect()
  2. 使用 pympler 发现所有已知的 Python 对象
import gc
import psutil
from pympler import muppy, summarize

gc.collect()
total_ram = psutil.Process().memory_info().rss
all_objects = muppy.get_objects(include_frames=True)
s = summary.summarize(all_objects)
python_objects_size = sum(row[2] for row in s)
Run Code Online (Sandbox Code Playgroud)

输出:102 MiB Python 对象,824 MiB RSS 内存!

[编辑] 3. 使用 tracemalloc; 它还返回价值约 100MiB 的 Python 对象

[编辑 2]export PYTHONMALLOC=malloc没有解决问题。

有没有办法查询 CPython 内存管理器来找出

  • 它持有多少 RAM,以便我可以从 RSS 中减去它并找出是否有任何未使用 PyMem_Malloc 并且正在泄漏的 C 库
  • 为什么它持有内存(例如,由于一个 20 字节的 PyObject 仍在被引用,因此发现它持有一个 64kb 的页面)
  • 识别调用 PyMem_Malloc …

python garbage-collection

6
推荐指数
1
解决办法
219
查看次数