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存储为名为sayJSON
的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为单字节)。
如果必须将值作为JavaString
处理,那么无论JSON库如何,您对此都无能为力;您需要足够的内存来处理该值和其他处理。此外,由于Java堆被划分为不同的代,64兆可能工作,也可能不工作:因为10兆需要连续,所以可能在旧代中分配
因此:请参阅“尝试使用更大的堆大小”,并查看您需要的堆大小。您可以尝试其他库吗?看看@JorgeCampos,它能处理这样的场景吗?没有测试,但值得一试。你有足够的堆吗?