非常大的 numpy 数组不会引发内存错误。它在哪里生活?

Very large numpy array doesn't throw memory error. Where does it live?

所以我有以下 numpy 数组:

X = np.zeros((1000000000, 3000), dtype=np.float32)

X.nbytes returns 12000000000000,即 12 TB。

我当然没有那么多内存(准确地说是 8GB)。这怎么发生的?数组分配在哪里?

我猜你正在使用 Mac。 OSX 将自动使用所有可用磁盘 space 作为虚拟内存。那么也许你有一个 biiiiiiiig 磁盘?

此代码在 linux 上导致 MemoryError

我 运行 在我的 Mac(OS 10.13、16GB 内存、512GB 固态硬盘)上进行了此操作,并获得了与您相同的成功结果。

This comment 似乎是一个可能的答案。 总结:由于您使用的是 zeros(),因此当矩阵的每个单元格都具有相同的值时,无需让它们占用 4 个字节。相反,在幕后,numpy 可能会显式地将矩阵中 等于公共值(在本例中为零)的所有值存储在内存中。

值得注意的是,运行 np.random.rand(1000000000, 3000) 对我的 Mac 造成了一些破坏,这与 zeros() 的作用相同,但用实际数据填充了矩阵。 RAM 达到极限,然后开始使用交换分区。

np.random.rand() 之前:

np.random.rand()期间: