Golang json Unmarshal阶段内存性能优化

文章讨论了在处理大规模且复杂结构的JSON数据时,Golang中的反序列化可能导致内存问题。作者遇到一个服务因大量数据反序列化而引发的OOM情况,通过pprof分析发现性能瓶颈在于Unmarshal过程。为解决此问题,提出了分两步反序列化的策略:首先只反序列化键,然后按需处理键对应的值,使用map[string]json.RawMessage来减少内存复制。这种方法在实践中显著提升了性能。
摘要由CSDN通过智能技术生成

先说结论:

golang 关于较大规模且复杂结构的json反序列化时,可以考虑分两步的方式:先只反序列化key,然后再按需取key对应的结构再进行反序列化。这样可以避免一次性反序列化完整的结构导致性能出现巨大损耗。

问题背景:

最近收到内存告警,一个平常极其稳定的用于数据采集的服务出现OOM,经过排查并不是内存泄露,就是单纯的大数据量情况下反序列化内存不够用。

数据采用map[string]map[string]string方式接收进行动态反序列化,因为接口返回的异常,导致返回的json结构大小暴涨六十倍以上。pprof发现性能损失就在Unmarshal阶段,由于接受对象是map结构而非明确定义的struct,导致内存copy严重,临时对象过多。

解决办法:

考虑到实际使用的是其中部分key,就进行先只反序列化key。因此采map[string]json.RawMessage(其实就是map[string][]byte)的结构,先获取key,然后按需反序序列化key对应的value。实测,性能有巨大提升。

效果如下:

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值