【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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值