問題描述
在之前的一篇博客後續中,我記錄了一個有關MemoryError問題,當時僅是根據自己實際需求簡單的敘述了一下解決方式,最近又遇到了這個頭疼的問題。
具體異常如下,其實就是創建的np矩陣太大了,內存不夠使!這太可怕了,實驗室工作站32G內存,你告訴我不夠用!我真的找不到目前實驗室更好的設備了!!!
幾種解決方式
衆多大哥給出的解決方式如下:
(1)既然是內存不夠使,那就換個更大內存配置的電腦吧(這TM還用你說!)
(2)numpy 在定義數組的時候,採用更低的精度。從float64降低爲float32。如:
array_ = np.zeros((10000,10000),dtype='float32') # 默認float64
(嘗試了這種方式,可行!不過在出現我的這個問題之前我就是用的float32,只好將float32降成了float16,雖然可行但是損失了精度,但是更大的矩陣可能float16也不行了)
(3)設置磁盤虛擬內存(這也算是個解決方式,每次設置完虛擬內存後需要重啓電腦,有點繁瑣。另外我是通過VPN遠程的實驗室電腦,通過設置虛擬內存運行程序,雖然成功了,但是遠程會斷!再次遠程會一直卡在正在配置會話的界面!這個問題在Microsoft官網論壇中有人提到過這個問題。)
(4)修改pycharm的運行內存
Help->Find Action->(type “VM Options”)->(Click)“Edit Custom VM Options” 打開pycharm64.exe.vmoptions進行編輯,修改-Xmx750m 爲 -Xmx4096m 分配4G內存,視情況而定。保存並重啓pycharm(這種方式沒有成功!)
(5)有位大佬說採用稀疏矩陣保存數據,一聽就是很NB的方式,至於可行性,我沒有進行實驗,有時間再把實驗結果記錄上!
最終解決方式
上述的幾種解決方式,有一定的可行性。但是我不相信,32G的內存創建不了這樣一個矩陣!!於是,從代碼的角度來排查問題,是不是存在一些髒數據。
果然,在函數傳參的時候,有行代碼(如下)引起了我的注意,它把傳入的矩陣有進行了一次astype,等於又穿了一個同樣大小的矩陣,內存頂不住了!!
self.data = dataset[0].astype(np.float32)
於是,修改這行代碼:
self.data = dataset[0]
運行程序,成功!
參考鏈接:
https://www.pythonheidong.com/blog/article/170102/
https://blog.csdn.net/nameyx/article/details/88916121