【问题标题】:Parse Large Json File ( around 300 Mb ) to list of POJO将大型 Json 文件(大约 300 Mb)解析为 POJO 列表
【发布时间】:2021-11-16 14:14:50
【问题描述】:

我有一个大约 300 MB 的大型 JSON 文件,我正在使用 Jackson 对象映射器对其进行解析:-

private void parseJson(Object obj) {

ObjectMapper map = new ObjectMapper();
Map<String,List<POJOClass>> result = new HashMap<>();
String str = map.writeValueAsString(obj);
map.registerModule(new JSR10module());
result = map.readValue(new ByteInputStream(str.getBytes(StandardCharSets.UTF_8)),
new TypeReference<Map<String,List<POJOClass>>>
() {});
}

parseJson 的参数是一个包含 JSON 字符串的对象。

这适用于大约 150 MB 的 JSON 文件,但是,当 JSON 文件大约 250-300 MB 时,它开始以Heap Space error 失败。我正在使用jackson 2.4.0

【问题讨论】:

  • 数据映射中有多少条目?一个字符串键和所有 POJOClass 的列表?还是具有多个 POJOClass 列表的多个键?
  • 具有多个 POJOClass 列表的多个键。

标签: java json jackson json-deserialization jackson2


【解决方案1】:

您的java 进程中没有足够的内存来处理这么大的文件。

启动应用时,使用-xmx 选项来增加java 进程使用的最大内存:

java -Xmx512m ...

java  -Xmx1G ... 

【讨论】:

  • 这是在 t2.large EC2 实例上运行,minHeap 为 4096m,maxHeap 为 6144m
  • 如果您已经尝试过这个解决方案,您应该使用其他系统来读取您的 jsonfile,例如 jackson streaming api
【解决方案2】:

您是否尝试过使用例如https://www.baeldung.com/jackson-streaming-api 在 JSON 上进行流式传输,这样您就不必一次将所有内容都放入内存。

【讨论】:

  • 您的答案可以通过额外的支持信息得到改进。请edit 添加更多详细信息,例如引用或文档,以便其他人可以确认您的答案是正确的。你可以找到更多关于如何写好答案的信息in the help center
【解决方案3】:

对于大的 json 文件,你应该使用 jackson stream api。 您可以找到文档here。它比正常方式花费更少的内存。一般来说,你的 POJO 必须满足一定的形状,它应该可以分成许多独立的部分。比如对象列表。然后用jackson stream api,就可以一一实现列表中的对象了。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-28
    • 2017-09-06
    • 1970-01-01
    相关资源
    最近更新 更多