【发布时间】:2018-12-21 04:38:28
【问题描述】:
我想在 Python 中创建一个空的 Numpy 数组,以便稍后用值填充它。下面的代码会生成一个 1024x1024x1024 数组,其中包含 2 字节整数,这意味着它应该在 RAM 中至少占用 2GB。
>>> import numpy as np; from sys import getsizeof
>>> A = np.zeros((1024,1024,1024), dtype=np.int16)
>>> getsizeof(A)
2147483776
从getsizeof(A),我们看到该数组占用了 2^31 + 128 个字节(可能是标头信息)。但是,使用我的任务管理器,我可以看到 Python 只占用了 18.7 MiB 的内存。
假设数组被压缩,我给每个内存槽分配了随机值,所以它不可能。
>>> for i in range(1024):
... for j in range(1024):
... for k in range(1024):
... A[i,j,k] = np.random.randint(32767, dtype = np.int16)
循环仍在运行,并且我的 RAM 正在缓慢增加(可能是因为组成 A 的数组因不可压缩的噪音而膨胀。)我假设它会使我的代码更快地强制 numpy 从一开始就扩展这个数组。奇怪的是,我在任何地方都没有看到这个记录!
那么,1. 为什么 numpy 会这样做? 2.如何强制numpy分配内存?
【问题讨论】:
-
1.我会怀疑内存效率和速度。 2. 如果需要,您可以使用随机数初始化一个 numpy 数组,只需
A=np.random.randn(1024,1024,1024)。不知道你为什么要强制 numpy 这样做。 -
That's normal
callocbehavior. 我不明白为什么如果你强制系统“真正”预先分配所有内存,这会更快。 -
哦,在谷歌上搜索后很有意义。我以前不熟悉calloc。我曾假设 Numpy 以智能方式存储每个数组,并在请求时将其替换为实际数组。
-
强制它提前分配内存可能会更慢,而不是更快。偶尔会有这样做的理由,但它们主要与您正在突破 RAM 的限制并与操作系统的过度使用作斗争的情况有关,或者您试图获得更详细的特定于平台的基准测试或分析的情况,等等,通常你最终不得不做一些低级和特定于平台的事情。
-
如果您确实需要这样做,您通常想要手动创建一个(匿名或磁盘支持的)
np.memmap或mmap.mmap、@987654329 @ 和MADV_SEQUENTIAL它(或您平台的相关等效项),然后使用映射创建一个数组进行存储。这仍然不会强制内核按照你想要的方式分配内存,但它强烈鼓励它这样做。