所以我有以下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