【Python】記錄一行代碼引發的MemoryError問題

問題描述

在之前的一篇博客後續中,我記錄了一個有關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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章