将golang map [string]接口存储到数据存储中的最佳方法

时间:2015-06-02 08:16:47

标签: json go deserialization

场景:我有一个任意的JSON大小,范围从300 KB - 从MongoDB读取6.5 MB。由于它是非常随意/动态的数据,我不能在golang中定义结构类型,所以我使用的是map[sting]interface{}类型。使用encoding/jsonUnmarshal方法解析JSON数据字符串。一些类似于Generic JSON with interface{}中提到的内容。

问题:但问题是需要花费更多时间(大约30ms到180ms)将字符串json解析为map[string]interface{}。 (使用json_encode / decode / igbinary / msgpack比较php解析json)

问题:有没有办法预处理并存储在缓存中?

我的意思是将字符串解析为map[string]interface{}并将其序列化并存储到某个缓存中,然后当我们检索它时,不应该花费太多时间来反序列化并继续执行。

注意:我是golang的新手任何建议都非常高兴。感谢

更新:使用Gobbinary内置程序包& Msgpack implementation for Golang包已经尝试过了。没有运气,反序列化的时间没有改善。

1 个答案:

答案 0 :(得分:2)

JSON的标准库包非常慢。有一个很好的理由:它使用RTTI提供非常灵活的界面,非常简单。因此,解组比PHP更慢......

幸运的是,还有另一种方法,即在您要使用的类型上实现json.Unmarshaller接口。如果实现了这个接口,那么包将使用它而不是标准方法,因此你可以看到巨大的性能提升。

为了帮助你,出现了一小组工具,其中包括:

(在这里列出来自记忆的主要玩家,必须有其他人)

这些工具将为您请求的类型生成json.Unmarshaller接口的定制实现。使用go:generate,您甚至可以将它们无缝集成到构建步骤中。