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

Posted

技术标签:

【中文标题】非常大的 numpy 数组不会引发内存错误。它在哪里生活? [复制]【英文标题】:Very large numpy array doesn't throw memory error. Where does it live? [duplicate] 【发布时间】:2018-03-31 01:22:32 【问题描述】:

所以我有以下 numpy 数组:

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

X.nbytes 返回 12000000000000,即 12 TB。

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

【问题讨论】:

【参考方案1】:

我猜你正在使用 Mac。 OSX 会自动使用所有可用的磁盘空间作为虚拟内存。那么也许你有一个 biiiiiiig 磁盘?

此代码在 linux 上导致 MemoryError

【讨论】:

啊。所以这是操作系统的事情。【参考方案2】:

我在我的 Mac(OS 10.13、16GB RAM、512GB SSD)上运行了这个程序,并获得了与您相同的成功结果。

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

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

np.random.rand() 之前:

np.random.rand() 期间:

【讨论】:

以上是关于非常大的 numpy 数组不会引发内存错误。它在哪里生活? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

numpy.memmap 无法处理非常大的数据

创建非常大的numpy数组时出现MemoryError [重复]

多处理 - 具有多维 numpy 数组的共享内存

使用 numpy 数组有效地索引 numpy 数组

一种序列化方法会产生内存不足错误,另一种则不会

将numpy数组设置为无释放内存吗?