我在解析一个巨大的json文件(200mb)时遇到问题。起初我尝试使用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
一些想法:
我可能不需要使用杰克逊树方法,因为我只想要字符串。
流杰克逊可能是一个选项,但我写它有困难因为我们的json格式非常灵活。任何建议将不胜感激!
由于
答案 0 :(得分:0)
使用基于对象的数据绑定有点内存效率,所以如果你可以定义Java类来匹配结构,那就更好了:更快,使用更少的内存。 但有时在预先不知道结构时需要树模型。
Streaming API可以提供帮助,您也可以混合使用方法:迭代JSON令牌,然后使用JsonParser.readValueAs(MyType.class)
或JsonParser.readValueAsTree()
。
这使您只能为JSON输入的子集构建内存树或对象。
答案 1 :(得分:0)
最后我使用流媒体方法。我从http打开一个流,每次读取一个固定数量的字节来缓冲。在我确定我在缓冲区中构建了一个有效的字符串之后,我发出了字符串并截断了缓冲区。这样我使用的内存非常少。谢谢!