Report
アプリケーションは、指定されたオブジェクトを受け取り続け、オブジェクトDisruptor
を 3 つの異なるコンシューマーに配置します。
Eclipse メモリ分析の助けを借りて、各Report
オブジェクトの保持ヒープ サイズは平均 20KB です。アプリケーションは で始まり、アプリケーション-Xmx2048
のヒープ サイズが 2GB であることを示します。
ただし、オブジェクトの数は一度に約 100,000 であるため、すべてのオブジェクトの合計サイズは約 2GB になります。
Disruptor
要件は、コンシューマがデータを非同期的に消費できるように、100,000 個のオブジェクトすべてをロードする必要があることです。ただし、各オブジェクトのサイズが 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
されます。のような多くのオブジェクトを作成したくありません。100,000 回反復する必要があるためByteArrayOutputStream
です。ObjectOutputStream
ByteArrayOutputStream
ObjectOutputStream
コンシューマーは、から文字列をデシリアライズして解凍する必要があり
Disruptor
ます。コンシューマーが 3 人いる場合、逆シリアル化と解凍を 3 回行う必要があります。どうでもいい?
アップデート:
@BoristheSpider が示唆したように、シリアル化と圧縮は 1 つのアクションで実行する必要があります。
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();
}