gpt4 book ai didi

java - 使用 jackson-mapper 解析为 json 的原因

转载 作者:行者123 更新时间:2023-12-01 11:36:42 26 4
gpt4 key购买 nike

我有一个大对象想要解析为 json Jackson-mapper。它工作得很好,直到对象变得太大。

我在 mac 上使用 intellij。

代码:

private String serializeToJson(T item) {
String json;
ObjectWriter ow = new ObjectMapper().writer().withDefaultPrettyPrinter();
try {
json = ow.writeValueAsString(item);
} catch (IOException e) {
e.printStackTrace();
json = "";
}
return json;
}

错误:

Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
:BL_generate FAILED

BUILD FAILED

Total time: 12 mins 14.491 secs
at java.util.Arrays.copyOfRange(Arrays.java:3664)
at java.lang.String.<init>(String.java:201)
at java.lang.StringBuilder.toString(StringBuilder.java:407)
at org.codehaus.jackson.util.TextBuffer.contentsAsString(TextBuffer.java:362)
at org.codehaus.jackson.io.SegmentedStringWriter.getAndClear(SegmentedStringWriter.java:100)
at org.codehaus.jackson.map.ObjectWriter.writeValueAsString(ObjectWriter.java:394)
at com.waze.routing.automation.io.string.JsonFileHandler.serializeToJson(JsonFileHandler.java:81)

I'm not sure how to split an object or to write it in parts (append to existing file)

我尝试过扩大堆空间,但没有帮助

task BL_generate(type: JavaExec) {
jvmArgs = ["-Xms1024m","-Xmx1024m"]
classpath sourceSets.main.runtimeClasspath
main = "com.m.BaselineGeneratorRunner"
}

我读过几篇文章:post1 , post2

但我不确定如何在我的情况下使用它。流媒体如何帮助我处理一个大物体? (不是数组)。

最佳答案

这里的主要问题是为什么这里需要一个java.lang.String?通常您宁愿将内容写入流或文件。

如果您确实希望将整个 JSON 序列化为字符串,则流式处理不会对您有帮助——字符串对象需要大量内存;至少是文件内容的 2 倍。

实际上,情况远不止于此:在构造 String 时,缓冲版本(在 char[] 片段中)占用了同样多的空间,因此大约是 String 的 4 倍。等效文件。你的堆也分为不同的区域(年轻代、老年代),所以我猜测在最坏的情况下你可能需要大约 10 倍的内存。如果是这样,设置 1024 兆应该可以让您处理大约 100 兆字节的 JSON 内容。

我会尝试找出如何避免首先创建一个大字符串,然后问题应该可以解决。

关于java - 使用 jackson-mapper 解析为 json 的原因,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29901305/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com