与 Jackson 一起解析 Huge JSON

Parsing Huge JSON with Jackson

考虑一个巨大的 JSON 结构如 -

{"text": "very HUGE text here.."}

我将此 JSON 存储为一个名为 say jsonObjectNode 对象。

现在我尝试从 ObjectNode.

中提取这段文字
String text = json.get("text").asText()

这个 JSON 可能有 4-5 MB 大小。当我 运行 这段代码时,我没有得到结果(程序一直在执行)。

上述方法适用于小型和正常尺寸的字符串。从 JSON 中提取大量数据还有其他最佳实践吗?

用 jackson(fastxml) 测试,7MB json 节点可以在 200 毫秒内解析

    ObjectMapper objectMapper = new ObjectMapper();
    InputStream is = getClass().getResourceAsStream("/test.json");
    long begin = System.currentTimeMillis();
    Map<String,String> obj = objectMapper.readValue(is, HashMap.class);
    long end = System.currentTimeMillis();
    System.out.println(obj.get("value").length() + "\t" + (end - begin));

输出是: 7888888 168

尝试升级你的杰克逊?

也许您的默认堆大小太小:如果输入是 5 兆 UTF-8 编码,Java String 通常需要 10 兆内存(char 是16 位,大多数用于英语字符的 UTF-8 是单字节)。 如果必须将值作为 Java String 处理,则无论 JSON 库如何,您对此无能为力;您需要足够的内存来处理价值和其余的处理。此外,由于 Java 堆被分为不同的代,64 兆可能会或可能不会:因为 10 兆需要连续,它可能会分配到老年代。

因此:尝试使用更大的堆大小,看看您需要多少。