在不增加堆大小的情况下解析巨大的json文件

时间:2013-07-21 10:39:58

标签: json jvm heap jackson

我在解析一个巨大的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格式非常灵活。任何建议将不胜感激!

由于

2 个答案:

答案 0 :(得分:0)

使用基于对象的数据绑定有点内存效率,所以如果你可以定义Java类来匹配结构,那就更好了:更快,使用更少的内存。 但有时在预先不知道结构时需要树模型。

Streaming API可以提供帮助,您也可以混合使用方法:迭代JSON令牌,然后使用JsonParser.readValueAs(MyType.class)JsonParser.readValueAsTree()。 这使您只能为JSON输入的子集构建内存树或对象。

答案 1 :(得分:0)

最后我使用流媒体方法。我从http打开一个流,每次读取一个固定数量的字节来缓冲。在我确定我在缓冲区中构建了一个有效的字符串之后,我发出了字符串并截断了缓冲区。这样我使用的内存非常少。谢谢!