最近遇到一个需要,须要在地图上显示某地区的路网线路,后果后端间接返回了3w多条数据
每条线路下坐标点靠近100个
这四舍五入就是300w的数据啊。
而且还不能分层级显示,只能一次性显示全副打点,没方法,硬着头皮放到地图上吧。
开发实现,关上网页,拖动地图,偶然呈现了卡顿的状况,然而,上线吧,能用就行
3天后
产品经理:诶,这数据怎么不会变啊,你加个轮询定时申请吧,还有地图能不能有点动态效果,隔一段时间随机定位到某个地点吧,而后地图打点点击要有具体数据的弹窗
打工人:...
加上轮询,关上网页,拖动地图,呈现了显著的掉帧和卡顿的状况,然而,上线吧,能用就行
一天后
产品经理:页面没怎么操作,怎么放着放着就崩了
打工人:...
关上控制台,关上工作管理器,发现首次加载页面内存就占用了靠近1G
第一次轮询,内存占用1.4G
第二次轮询,内存占用1.8G
每次轮询,内存占用就增大了400M,好家伙,这样上来1T的内存都不够用啊(况且一个tab内存占用到4G左右页面就解体了
这...不对啊,我明明地图对象都移除了,数据也是重置了啊,内存怎么始终在增大呢?
于是开始了修bug之路
通过重复调试和定位,发现是vue数据深度监听和地图对象存在援用关系导致内存无奈开释(狐疑)
那这个问题好解决啊,禁用vue深度监听不就好了吗
因为本我的项目中申请的数据只用于展现,不会对数据作批改,所以只须要在赋值data前把数据解冻即可
this.list = Object.freeze(list)
因为数据被解冻,所以vue无奈深度遍历数据给数据增加get和set属性,这样就缩小了数据监听带来的问题,而且在大数据量的状况下Object.freeze()十分有用
Object.freeze()办法能够解冻一个对象,一个被解冻的对象再也不能被批改,当然你能够将变量的援用替换掉
- 不能增加新属性
- 不能删除已有属性
- 不能批改已有属性的可枚举性、可配置性、可写性
- 不能批改已有属性的值
- 不能批改原型