簡體   English   中英

使用超大的json文件。 總是內存不足

[英]Working with extra large json files. Return always out of memory

如何使用帶有jackson的流API json? 請參閱下面的代碼:

    ObjectMapper mapper = new ObjectMapper();

    Map<String, Object> map = new HashMap<String, Object>();

    List<Object> list = new ArrayList<Object>();

    // Get images in database
    try {
            Class.forName(DRIVER);
            connection = DriverManager.getConnection(URL, USER, PASSWORD);

            Statement s = connection.createStatement();
            ResultSet r = s.executeQuery("select * from images");

            while (r.next()) {

                byte[] imageBytes = r.getBytes("image");
                String imageBase64 = DatatypeConverter.printBase64Binary(imageBytes);
                list.add(imageBase64);
            }

    } catch (SQLException e) {

    }

    map.put("images", list);

    // Stream Json API
    try {
            mapper.writeValue(new File("c:\\images.json"), map);
    } catch (JsonGenerationException e) {
            e.printStackTrace();
    } catch (JsonMappingException e) {
            e.printStackTrace();
    } catch (IOException e) {
            e.printStackTrace();
    }

總是退回內存。 我不知道用傑克遜使用流。 我使用超大的json,平均2000個圖像,每個圖像一個imageBase64。 我究竟做錯了什么?

而不是將所有圖像保存在內存中,只需逐步讀取和寫入它們。 可以在此處找到Jackson Streaming API的示例(“閱讀和編寫事件流”)。

編輯:這應該太難以弄清楚人們......但這是一個骨架的例子:

// typed from memory, some methods may be off a bit
JsonFactory f = objectMapper.getFactory();
JsonGenerator gen = f.createGenerator(new File("c:\\images.json"));
gen.writeStartArray(); // to get array of objects
// get the DB connection etc
while (r.next()) {
  gen.writeFieldName("image");
  InputStream in = r.getBinaryStream("image");
  gen.writeBinary(in, -1); // length optional for JSON
  in.close();
}

gen.writeEndArray(); //獲取對象數組gen.close();

這應該做的伎倆。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM