【问题标题】:Parsing Huge JSON with Jackson用 Jackson 解析巨大的 JSON
【发布时间】:2015-06-28 10:59:14
【问题描述】:

考虑一个巨大的 JSON,其结构类似于 -

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

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

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

String text = json.get("text").asText()

这个 JSON 的大小可以是 4-5 MB。当我运行这段代码时,我没有得到结果(程序永远执行)。

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

【问题讨论】:

  • 你可以试试其他库吗?看看GSON
  • @JorgeCampos 会处理这种情况吗?
  • 没有测试,但值得一试。
  • 堆够了吗?

标签: java json jackson


【解决方案1】:

用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

尝试升级你的杰克逊?

【讨论】:

    【解决方案2】:

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

    所以:看看尝试更大的堆大小,看看你需要多少。

    【讨论】:

      猜你喜欢
      • 2012-05-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-07-05
      • 2018-06-30
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多