응용 프로그램은 Report
이라는 객체를 계속 수신하고 객체를 서로 다른 세 가지 소비자에 대해 Disruptor
에 저장합니다.직렬화의 성능 비용과 Java에서 객체 압축
Eclipse 메모리 분석을 사용하면 각 Report
오브젝트의 보유 된 힙 크기는 평균 20KB입니다. 응용 프로그램은 -Xmx2048
으로 시작하여 응용 프로그램의 힙 크기가 2GB임을 나타냅니다.
그러나 개체 수는 한 번에 약 100,000 개이므로 개체의 전체 크기는 약 2GB입니다.
소비자가 데이터를 비동기 적으로 소비 할 수 있도록 모든 100,000 개의 개체를 Disruptor
에로드해야한다는 요구 사항이 있습니다. 그러나 각 개체의 크기가 20KB 크기라면 불가능합니다.
그래서 나는 그것을 String
에 개체를 직렬화하고 압축 싶습니다
압축하기 전에 :
private static byte[] toBytes(Serializable o) throws IOException {
ByteArrayOutputStream baos = new ByteArrayOutputStream();
ObjectOutputStream oos = new ObjectOutputStream(baos);
oos.writeObject(o);
oos.close();
return baos.toByteArray();
}
private static String compress(byte[] str) throws IOException {
ByteArrayOutputStream out = new ByteArrayOutputStream();
GZIPOutputStream gzip = new GZIPOutputStream(out);
gzip.write(str);
gzip.close();
return new String(Base64Coder.encode(out.toByteArray()));
}
compress(toBytes(Report))
후, 객체의 크기가 작 압축 후
지금 개체의 문자열은 약 6KB입니다. 지금은 더 좋습니다.
크기 문자열보다 작은 다른 데이터 형식이 있습니까 :
여기 내 질문?
때마다 직렬화 및 압축을 호출하면
ByteArrayOutputStream
,ObjectOutputStream
등의 개체가 생성됩니다.ByteArrayOutputStream
,ObjectOutputStream
과 같은 많은 객체를 만들고 싶지 않습니다. 왜냐하면 객체를ByteArrayOutputStream
,ObjectOutputStream
과 같이 한 번만 만들고 각 반복에 사용할 수 있도록 코드를 어떻게 디자인해야합니까?소비자는 역 직렬화하고
Disruptor
에서 문자열을 압축 해제해야합니다. 세 명의 소비자가 있으면 세 번 deserialize하고 압축을 풀 필요가 있습니다. 주위에?
업데이트 : @BoristheSpider 제안으로
, 직렬화 및 압축 한 조치를 수행해야합니다 ObjectOutputStream에 압축을 사용하여
private static byte[] compressObj(Serializable o) throws IOException {
ByteArrayOutputStream bos = new ByteArrayOutputStream();
GZIPOutputStream zos = new GZIPOutputStream(bos);
ObjectOutputStream ous = new ObjectOutputStream(zos);
ous.writeObject(o);
zos.finish();
bos.flush();
return bos.toByteArray();
}
아마도 이것은 갈 길이 아닙니다. 성능에 큰 영향을줍니다. 이런 경우를위한 디자인 패턴이 있습니다. [Flyweight pattern] (http://en.wikipedia.org/wiki/Flyweight_pattern). 참고로 스트림을 직접 압축하면 어떨까요? 왜 당신은 처음에'byte []'를 만들고 나서 그것을 압축합니까? –
앱이 사용자 지정 개체 인 '보고서'를받습니다. 내가하고있는 일은'Report'를 직렬화하고 직렬화 된 String을 압축하는 것입니다. 'Report'를 직접 압축하는 것이 좋습니다? – DerekY
'ByteArrayOutputStream'을'GZIPOutputStream'_then an_'ObjectOutputStream'에 래핑하는 것이 좋습니다. 이 작업은 한 번의 작업으로 일련 화되고 압축됩니다. –