gpt4 book ai didi

java - 在 Java 中序列化和压缩对象的性能成本

转载 作者:行者123 更新时间:2023-11-29 08:51:13 25 4
gpt4 key购买 nike

应用程序不断接收名为Report 的对象,并将这些对象放入Disruptor 以供三个不同的消费者使用。

借助 Eclipse 内存分析,每个 Report 对象的 Retained Heap Size 平均为 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))后,对象尺寸变小了:

压缩前

Before compression

压缩后

After compression

现在对象的字符串大约是 6KB。现在好多了。

这是我的问题:

  1. 是否有其他数据格式的大小小于String?

  2. 每次调用序列化和压缩都会创建ByteArrayOutputStreamObjectOutputStream等对象。我不想创建很多对象,例如 ByteArrayOutputStreamObjectOutputStream,因为我需要迭代 100,000 次。如何设计代码以便像 ByteArrayOutputStream, ObjectOutputStream 每次迭代只创建一次并使用它?

  3. 消费者需要从 Disruptor 反序列化和解压缩字符串。如果我有三个消费者,那么我需要反序列化和解压三次。有办法吗?


更新:

正如@BoristheSpider 所建议的,序列化和压缩应该在一个操作中执行:

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

最佳答案

使用 ObjectOutputStream 和压缩比使用 Disruptor 昂贵得多,这违背了使用它的目的。它可能要贵 1000 倍。

您最好限制一次排队的对象数量。除非您的设计存在严重错误,否则拥有一个仅包含 1000 个 20 KB 对象的队列应该足以确保您所有的使用者都高效工作。

顺便说一句,如果你需要持久性,我会使用 Chronicle(部分原因是我写的)这不需要压缩或字节 [] 或字符串来存储,持久化所有消息,你的队列是无界的并且完全脱离堆。即您的 100K 对象将使用 << 1 MB 的堆。

关于java - 在 Java 中序列化和压缩对象的性能成本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22628581/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com