Java 用Jackson解析巨大的JSON

Java 用Jackson解析巨大的JSON,java,json,jackson,Java,Json,Jackson,考虑一个结构类似- {"text": "very HUGE text here.."} 我将此JSON存储为名为sayJSON的ObjectNode对象 现在,我尝试从ObjectNode中提取此文本 String text = json.get("text").asText() 这个JSON的大小大约为4-5MB。当我运行这段代码时,我不会得到结果(程序永远保持执行) 上述方法适用于小尺寸和正常尺寸的字符串。从JSON中提取海量数据还有其他最佳实践吗?使用jackson(fastxml)测

考虑一个结构类似-

{"text": "very HUGE text here.."}
我将此JSON存储为名为say
JSON
ObjectNode
对象

现在,我尝试从
ObjectNode
中提取此文本

String text = json.get("text").asText()
这个JSON的大小大约为4-5MB。当我运行这段代码时,我不会得到结果(程序永远保持执行)

上述方法适用于小尺寸和正常尺寸的字符串。从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));
ObjectMapper ObjectMapper=new ObjectMapper();
InputStream=getClass().getResourceAsStream(“/test.json”);
long begin=System.currentTimeMillis();
Map obj=objectMapper.readValue(is,HashMap.class);
long end=System.currentTimeMillis();
System.out.println(obj.get(“value”).length()+“\t”+(end-begin));
输出为: 78888168


尝试升级您的jackson?

可能您的默认堆大小太小:如果输入是5兆UTF-8编码的,则其中的Java
字符串通常需要10兆内存(
char
为16位,英文字符的大多数UTF-8为单字节)。 如果必须将值作为Java
String
处理,那么无论JSON库如何,您对此都无能为力;您需要足够的内存来处理该值和其他处理。此外,由于Java堆被划分为不同的代,64兆可能工作,也可能不工作:因为10兆需要连续,所以可能在旧代中分配


因此:请参阅“尝试使用更大的堆大小”,并查看您需要的堆大小。

您可以尝试其他库吗?看看@JorgeCampos,它能处理这样的场景吗?没有测试,但值得一试。你有足够的堆吗?