非常大的 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()
期间:
所以我有以下 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()
期间: