考虑一个巨大的JSON,结构如 -
{"text": "very HUGE text here.."}
我将此JSON存储为名为ObjectNode
的{{1}}对象。
现在我尝试从json
。
ObjectNode
这个JSON的大小可以是4-5 MB。当我运行这段代码时,我得不到结果(程序一直在执行)。
上述方法适用于小型和普通大小的字符串。还有其他最佳实践从JSON中提取大量数据吗?
答案 0 :(得分:2)
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
尝试升级杰克逊?
答案 1 :(得分:1)
也许你的默认堆大小太小:如果输入是5兆UTF-8编码,它的Java String
通常需要10兆内存(char
是16位,大多数是UTF英语字符的-8是单字节)。
如果必须将值作为Java String
处理,那么无论JSON库如何,您都无法做到这一点。你需要足够的内存来处理值和剩余的处理。此外,由于Java堆被分成不同的代,64兆可能或可能不起作用:因为10兆需要连续,它可能在旧一代中分配。
所以:看看尝试更大的堆大小,看看你需要多少。