与 Jackson 一起解析 Huge JSON
Parsing Huge JSON with Jackson
考虑一个巨大的 JSON 结构如 -
{"text": "very HUGE text here.."}
我将此 JSON 存储为一个名为 say json
的 ObjectNode
对象。
现在我尝试从 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 兆需要连续,它可能会分配到老年代。
因此:尝试使用更大的堆大小,看看您需要多少。
考虑一个巨大的 JSON 结构如 -
{"text": "very HUGE text here.."}
我将此 JSON 存储为一个名为 say json
的 ObjectNode
对象。
现在我尝试从 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 兆需要连续,它可能会分配到老年代。
因此:尝试使用更大的堆大小,看看您需要多少。