非常大的 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 数组不会引发内存错误。它在哪里生活? [复制]的主要内容,如果未能解决你的问题,请参考以下文章