[英]Best way to store golang map[string]interface into data store
场景 :我从MongoDB读取的JSON大小介于300 KB-6.5 MB之间。 由于它是非常任意/动态的数据,因此我无法在golang中定义结构类型,因此我正在使用map[sting]interface{}
类型。 JSON数据字符串通过使用encoding/json
的Unmarshal
方法进行解析。 一些类似于与interface {}的通用JSON中提到的内容。
问题 :但是问题在于,将字符串json解析为map[string]interface{}
花费更多的时间(大约30ms至180ms)。 (与使用json_encode / decode / igbinary / msgpack解析json的php相比)
问题 :有什么方法可以对其进行预处理并存储在缓存中?
我的意思是将字符串解析为map[string]interface{}
并将其序列化并存储到某个缓存中,然后在我们检索它时,不需要花费很多时间进行反序列化并继续执行。
注意:对于Golang,我是新手,任何建议都应予以高度重视。 谢谢
更新 :已尝试使用Gob
序列化, binary
内置软件包和Msgpack对Golang软件包的实现 。 没有运气,没有序列化的时间没有改善。
众所周知,JSON的标准库包非常慢。 这样做有一个很好的理由:它使用RTTI提供了非常简单的非常灵活的界面。 因此,解组比PHP的慢。
幸运的是,还有另一种方法,可以在要使用的类型上实现json.Unmarshaller
接口。 如果实现了此接口,则程序包将使用它而不是其标准方法,因此您可以看到性能的极大提高。
为了帮助您,这里出现了一小组工具,其中包括:
(这里列出了内存中的主要参与者,肯定还有其他参与者)
这些工具将为您请求的类型生成json.Unmarshaller
接口的定制实现。 使用go:generate
,您甚至可以将它们无缝集成到构建步骤中。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.