问题描述
在之前的一篇博客后续中,我记录了一个有关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