杰克逊管理Java中非常大的JSON

时间:2013-08-21 12:47:03

标签: java json performance jackson

所以我拥有一个非常大的JSON文件(600MB),我的Java项目中有一些模块可以导入JSON文件中的每个项目,并将其属性写入大型数据库中的多个表。它适用于我必须处理的相对较小的JSON文件,但是这个文件会使JVM抛出OutOfMemoryException。  我使用的库是Jackson,我在以下函数的Java列表中加载JSON文件中的每个项目:

  public List<Products> listOfProducts(String JSONString)
  throws JsonParseException, JsonMappingException, IOException {
byte[] latin1 = JSONString.getBytes("ISO-8859-1");
String fromUtf8Bytes = new String(latin1);
ObjectMapper mapper = new ObjectMapper();
Products[] productsArray = mapper.readValue(fromUtf8Bytes,
    Products[].class);

List<Products> productsList= Arrays.asList(productsArray);

return productsList;

}

然后将返回的列表传递给我的导入函数,但在此之前发生内存不足异常。 关于如何处理如此大的文件而不将原始JSON分解为几个较小的文件的任何想法?

2 个答案:

答案 0 :(得分:0)

使用Jackson的流式API,您可以解析文件而不必将其完全存储在内存中。解析每个产品并将其放入您的数据库(或同时使用一些产品,可能会更好地处理数据库开销),但不要尝试一次加载所有产品。

答案 1 :(得分:0)

有几种可能的解决方案,可以归结为增量处理或缓存(这取决于您对productList的要求),但到目前为止最简单的解决方案是:购买更多RAM并增加最大JVM堆大小。对于这个额外的内存开销,所需的额外RAM可能比开发人员的时间便宜。