我在解析一个巨大的json文件(200 mb)时遇到了问题。起初我尝试使用Jackson将json解析为树。但是,我遇到了堆大小问题。由于某些原因,增加堆大小不是一个选项。
JSON格式:
{
"a1":{ "b1":{"c1":"somevalue", "c2":"somevalue"}, ... },
"a2":{ "b1":{"c1":"somevalue"},"c3":"somevalue"}, ... },
....
}
我想做的是生成字符串
str1 = "{ "b1":{"c1":"somevalue", "c2":"somevalue"}, ... }"
str2 = "{ "b1":{"c3":"somevalue"},"c4":"somevalue"}, ... }"
有没有什么方法可以做到这一点,而不会出现堆问题?
在python中,有一种简单的方法可以做到这一点,并且没有堆问题(没有JVM)
data = json.loads(xxx)
for key,val in data.iteritems():
puts val
一些想法:我可能不需要使用Jackson树的方法,因为我只想要字符串。流Jackson可能是一个选项,但我有困难写它,因为我们的json格式是相当灵活的。任何建议将不胜感激!
谢谢
2条答案
按热度按时间6ojccjat1#
使用基于对象的数据绑定更节省内存,因此如果可以定义Java类来匹配结构,那是更好的方法:但在结构未知的情况下,有时需要使用树模型。
流API可以提供帮助,您还可以混合使用以下方法:迭代JSON标记,然后使用
JsonParser.readValueAs(MyType.class)
或JsonParser.readValueAsTree()
。这允许您仅为JSON输入的子集构建内存中的树或对象。9udxz4iz2#
最后我使用了一个流的方法。我打开一个来自http的流,每次读取固定数量的字节到缓冲区。当我确定我在缓冲区中建立了一个有效的字符串后,我发出字符串并截断缓冲区。这样我使用了很少的内存。谢谢!