gpt4 book ai didi

java - 读取一个巨大的 json 对象数组文件

转载 作者:行者123 更新时间:2023-12-01 14:16:44 30 4
gpt4 key购买 nike

我有一个大小为 40Gb 的大文件,当我尝试将此对象数组的 json 文件转换为 Java 对象列表时,它崩溃了,我使用了所有大小的最大堆 xmx但没有结果!

public Set<Interlocutor> readJsonInterlocutorsToPersist() {
String userHome = System.getProperty(USER_HOME);
log.debug("Read file interlocutors "+userHome);
try {
ObjectMapper mapper = new ObjectMapper();
// JSON file to Java object
Set<Interlocutor> interlocutorDeEntities = mapper.readValue(
new File(userHome + INTERLOCUTORS_TO_PERSIST),
new TypeReference<Set<Interlocutor>>() {
});
return interlocutorDeEntities;
} catch (Exception e) {
log.error("Exception while Reading InterlocutorsToPersist file.",
e.getMessage());
return null;
}
}
有没有办法使用 BufferedReader 来读取这个文件然后逐个推对象?
编辑 :
我从@Viacheslav 找到了解决方案:
public Set<Interlocutor> readJsonInterlocutorsToPersist() throws IOException {
String userHome = System.getProperty(USER_HOME);
log.debug("readJsonInterlocutorsToPersist file");
JsonReader reader = new JsonReader(new InputStreamReader(new FileInputStream(userHome + INTERLOCUTORS_TO_PERSIST), "UTF-8"));
Set<Interlocutor> interlocutorDeEntities = new HashSet<Interlocutor>();
reader.beginArray();
Gson gson = new GsonBuilder()
.registerTypeAdapter(Date.class, UnixEpochDateTypeAdapter.getUnixEpochDateTypeAdapter())
.create();
int i = 0;
while (reader.hasNext()) {
Interlocutor message = gson.fromJson(reader, Interlocutor.class);
log.debug((++i) +" add new interlocutor");
interlocutorDeEntities.add(message);
}
reader.endArray();
reader.close();
return interlocutorDeEntities;
}
非常感谢 !

最佳答案

您绝对应该看看 Jackson Streaming API ( https://www.baeldung.com/jackson-streaming-api )。我自己将它用于 GB 大型 JSON 文件。最棒的是你可以将你的 JSON 分成几个更小的 JSON 对象,然后用 mapper.readTree(parser) 解析它们。 .这样你就可以将普通 Jackson 的便利与 Streaming API 的速度和可扩展性结合起来。
与您的问题相关:
我知道您有一个非常大的数组(这是文件大小的原因)和一些更具可读性的对象:
例如。:

[ // 40GB
{}, // Only 400 MB
{},
]
您现在可以做的是使用 Jackson 的 Streaming API 解析文件并遍历数组。但是每个单独的对象都可以解析为“常规”Jackson 对象,然后轻松处理。
你可以看看这个 Use Jackson To Stream Parse an Array of Json Objects这实际上非常符合您的问题。

关于java - 读取一个巨大的 json 对象数组文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62674295/

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