场景:我有一个任意的JSON大小,范围从300 KB - 从MongoDB读取6.5 MB。由于它是非常随意/动态的数据,我不能在golang中定义结构类型,所以我使用的是map[sting]interface{}
类型。使用encoding/json
的Unmarshal
方法解析JSON数据字符串。一些类似于Generic JSON with interface{}中提到的内容。
问题:但问题是需要花费更多时间(大约30ms到180ms)将字符串json解析为map[string]interface{}
。 (使用json_encode / decode / igbinary / msgpack比较php解析json)
问题:有没有办法预处理并存储在缓存中?
我的意思是将字符串解析为map[string]interface{}
并将其序列化并存储到某个缓存中,然后当我们检索它时,不应该花费太多时间来反序列化并继续执行。
注意:我是golang的新手任何建议都非常高兴。感谢
更新:使用Gob
,binary
内置程序包& Msgpack implementation for Golang包已经尝试过了。没有运气,反序列化的时间没有改善。
答案 0 :(得分:2)
JSON的标准库包非常慢。有一个很好的理由:它使用RTTI提供非常灵活的界面,非常简单。因此,解组比PHP更慢......
幸运的是,还有另一种方法,即在您要使用的类型上实现json.Unmarshaller
接口。如果实现了这个接口,那么包将使用它而不是标准方法,因此你可以看到巨大的性能提升。
为了帮助你,出现了一小组工具,其中包括:
(在这里列出来自记忆的主要玩家,必须有其他人)
这些工具将为您请求的类型生成json.Unmarshaller
接口的定制实现。使用go:generate
,您甚至可以将它们无缝集成到构建步骤中。