所以我有以下numpy的数组:非常大的numpy数组不会抛出内存错误。它在哪里生活?
X = np.zeros((1000000000, 3000), dtype=np.float32)
X.nbytes
返回12000000000000
,这是12 TB。
我当然没有那么多的内存(准确的说是8GB)。这怎么发生的?数组在哪里分配?
所以我有以下numpy的数组:非常大的numpy数组不会抛出内存错误。它在哪里生活?
X = np.zeros((1000000000, 3000), dtype=np.float32)
X.nbytes
返回12000000000000
,这是12 TB。
我当然没有那么多的内存(准确的说是8GB)。这怎么发生的?数组在哪里分配?
我想你正在使用Mac。 OSX将自动使用所有可用磁盘空间作为虚拟内存。所以也许你有一个biiiiiiig磁盘?
此代码在Linux上导致MemoryError
。
我在我的Mac(操作系统10.13,16GB RAM,512GB SSD)上运行了这个程序,并且获得了与您相同的成功结果。
This comment似乎是一个可能的答案。 总结:由于您使用的是zeros()
,因此当矩阵的每个单元都具有相同的值时,不需要占用4个字节。相反,在幕后,numpy可以明确地在存储器中存储矩阵中的不是等于公共值(在这种情况下为零)的所有值。
值得注意的是,运行np.random.rand(1000000000, 3000)
会在我的Mac上造成一些破坏,它与zeros()
的功能相同,但会用实际数据填充矩阵。 RAM变得最大,然后开始使用交换分区。
唉唉。所以这是一个操作系统的事情。 – user3813674