gpt4 book ai didi

python - 为什么 numpy 保留这么多未使用的内存?

转载 作者:太空宇宙 更新时间:2023-11-03 15:32:12 25 4
gpt4 key购买 nike

$ python3
Python 3.5.2 (default, Nov 12 2018, 13:43:14)
[GCC 5.4.0 20160609] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> def mem():
... with open("/proc/{}/status".format(os.getpid())) as f:
... for line in f:
... if 'VmRSS' in line:
... return line.strip()
...
>>> import gc
>>> import numpy
>>> import os
>>> numpy.version.version
'1.16.4'
>>> print(mem())
VmRSS: 27000 kB
>>> a = [numpy.random.random(size=(128, 128)) for _ in range(5000)]
>>> print(mem())
VmRSS: 668876 kB
>>> gc.collect()
0
>>> print(mem())
VmRSS: 668876 kB
>>> a = None
>>> print(mem())
VmRSS: 455432 kB
>>> gc.collect()
0
>>> print(mem())
VmRSS: 455432 kB
>>> del a
>>> print(mem())
VmRSS: 455432 kB
>>> gc.collect()
0
>>> print(mem())
VmRSS: 455432 kB

在上面的代码片段中,我分配了大约 600MB 的中等大小的 numpy 数组(当数组明显变小或变大时不会发生这种行为,如果您只使用 Python 对象也不会发生这种情况),但是当我随后释放它仍然卡在三分之二以上内存上的数组,再多的强制垃圾收集或删除也不会将该内存返回给操作系统。

我相当确定这不是 numpy 中的内存泄漏,因为新的 numpy 分配将重用该内存(尽管 Python 分配不会),所以任何人都可以阐明为什么会发生这种情况吗?


编辑:看起来这至少部分与系统分配器有关:

$ LD_PRELOAD=/tmp/tmp.Rl0Ofo69sZ/jemalloc-5.2.1/lib/libjemalloc.so python3
Python 3.5.2 (default, Nov 12 2018, 13:43:14)
[GCC 5.4.0 20160609] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> def mem():
... with open("/proc/{}/status".format(os.getpid())) as f:
... for line in f:
... if 'VmRSS' in line:
... return line.strip()
...
>>> import numpy
>>> import os
>>> print(mem())
VmRSS: 33040 kB
>>> a = [numpy.random.random(size=(128, 128)) for _ in range(5000)]
>>> print(mem())
VmRSS: 694912 kB
>>> a = None
>>> print(mem())
VmRSS: 159568 kB

我目前将其余部分归结为无聊的旧内存碎片,但很想知道这里是否还有其他事情发生(numpy 似乎确实做了一些 basic caching of it's own )。

最佳答案

Numpy 是一个 C 扩展,它管理自己的内存,因此不涉及 Python 的垃圾收集器。 Numpy 将使用 malloc() 或 calloc() 为其数组在堆上分配空间,并在完成后使用 free() 释放该空间(当您设置 a = None 时会发生这种情况)。然而,堆分配器不一定会在空闲时将内存释放回操作系统,这是否发生取决于内存是如何从操作系统和堆碎片等方面获得的。但是内存可以正如您所观察到的,仍然会被流程重用。

关于python - 为什么 numpy 保留这么多未使用的内存?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57356581/

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