Golang json Unmarshal阶段内存性能优化

先说结论:

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
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

sgy小雨点儿

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值