2013-02-26 2 views
4

jackson에서 스트림 API json을 사용하는 방법은 무엇입니까? 아래 코드를 참조하십시오.특대 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 작업했습니다. 내가 도대체 ​​뭘 잘못하고있는 겁니까?

+0

[다음은 예입니다] (http://www.mkyong.com/java/jackson-streaming-api-to-read-and-write-json/) –

+0

@SotiriosDelimanolis 우수합니다. 정말 고마워요. 메모리 부족 문제를 해결하십시오. 이제는 json을 생성하는 방법을 보여줍니다. –

+0

당신은 단지 일부 InputStream을 통해 파일을 읽을 수 있으며, String 내부로 밀고 인쇄 할 수 있습니다. –

답변

1

모든 이미지를 메모리에 유지하는 대신 점진적으로 읽고 쓰십시오. Jackson Streaming API의 예는 here ("이벤트 스트림 읽기 및 쓰기")을 참조하십시오.

편집 :이 사람을 알아 내기 위해 너무 어렵다 ...하지만 여기 골격 예제해야

// 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();

그 트릭을해야합니다.

+0

같은 문제가 있습니다. 파일이 거대하기 때문에 base64를 사용하여 json을 생성 할 수 없습니다. 안돼. 데이터베이스에서 각 이미지에 대한 URL을 생성하려면 어떻게해야합니까? 어떤 생각? –

+0

그게 뭐야? 점진적으로 읽고 쓰면 메모리에 저장되지 않습니다. 파일이나 다른 스트리밍 가능한 저장소에 분명히 쓸 수 있습니다. 그리고 Base64를 메모리에 인코딩하는 대신,'InputStream'을 사용하여 바이너리 데이터에 액세스 할 수있는 한 점진적으로 기록 할 수 있습니다. URL에 대해서는 JSON 데이터 바인딩의 또 다른 질문과 범위 밖에 있습니다. 그러나 실제로, 질문하는 대신에 당신이 지적한 예를 이해하려고 노력해야하며, 차이를 만들어내는 것을보아야합니다. – StaxMan

+0

감사합니다. images.json을 생성 할 수는 있지만 문제는 없습니다.하지만 images.json을 읽는 것은 불가능합니다. 거대한 파일입니다. 제한된 자원으로 모바일 응용 프로그램을 사용할 수 없습니다. 이제 각 이미지에 대한 URL을 생성하고 내 문제를 해결하십시오. –

관련 문제