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

u5rb5r59  于 2022-11-07  发布在  其他
关注(0)|答案(2)|浏览(179)

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

6ojccjat

6ojccjat1#

使用基于对象的数据绑定更节省内存,因此如果可以定义Java类来匹配结构,那是更好的方法:但在结构未知的情况下,有时需要使用树模型。
流API可以提供帮助,您还可以混合使用以下方法:迭代JSON标记,然后使用JsonParser.readValueAs(MyType.class)JsonParser.readValueAsTree()。这允许您仅为JSON输入的子集构建内存中的树或对象。

9udxz4iz

9udxz4iz2#

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

相关问题