gpt4 book ai didi

java - GZIPOutputStream 与 BufferedOutputStream 的性能

转载 作者:行者123 更新时间:2023-12-02 12:17:47 35 4
gpt4 key购买 nike

我的应用程序正在将大量视频和 i2c 传感器数据记录到磁盘文件中 - 尽可能快。目前我正在将所有内容转换为字节,并使用 BufferedOutputStream 进行写入。 @Siguza 非常友善地建议研究 GZIPOutputStream 来完成这项工作。我想知道您是否对性能问题有任何想法,无论是赞成还是反对...我认为处理器遥遥领先,磁盘写入是瓶颈 - 所以我希望在写入之前通过 GZIPOutputStream 进行动态压缩一个好的策略。对此有任何想法都非常欢迎。

添加:回应评论...

事实证明,压缩并不那么昂贵……而且我提出最初问题的方式也不是很好,正如埃尔文正确指出的那样。关于压缩性能的问题不在 BufferedOutputStream 和 GZIPOutputStream 之间...压缩和解压缩的流都需要包装到 BufferedOutputStream 中,但是如果在将原始 FileOutputStream 包装到 GZIPOutputStream 之前,会增加多少成本包装在 BufferedOutputStream 中。这就是答案。我正在使用代码

byte[] bs = RHUtilities.toByteArray((int)1);
boolean zipped = false;

FileOutputStream fos = new FileOutputStream(datFile);
BufferedOutputStream bos = null;
if (zipped) {
GZIPOutputStream gz = new GZIPOutputStream(fos);
bos = new BufferedOutputStream(gz);
} else
bos = new BufferedOutputStream(fos);
long startT = System.currentTimeMillis();
for (int i=0; i<1000000; i++)
bos.write(bs);
bos.flush();
System.out.println(System.currentTimeMillis()-startT);
bos.close();

我的 2012 macpro 笔记本电脑使用

写入了 1M 个整数

zipped=true 在 38 毫秒内 - 文件大小 4MB
21 毫秒内 zipped=false - 文件大小 4KB

而且,是的,我喜欢压缩:-)

读取性能几乎相同(83 毫秒与 86 毫秒)

FileInputStream fin = new FileInputStream(datFile);

GZIPInputStream gin = new GZIPInputStream(new FileInputStream(datFile));

一切都好...

最佳答案

这个问题引发了很多问题:

i am thinking the processor is way ahead and the disk write is the bottleneck

“我在想”并不是优化性能的合理基础。您需要进行一些测量来找出瓶颈的实际位置。 (如果您的“想法”是错误的,那么更改为 GZipOutputStream 可能会让事情变得更糟。)

或者,尝试一下,然后衡量它是否可以提高性能。

从理论角度来看,如果处理器和光盘速度之间存在显着不匹配,那么压缩可能会有所帮助。一个可能的好处是压缩还可以节省磁盘空间。

但缺点是:

  • 压缩的成本相对较高(解压缩也是如此),因此您最终可能会使用比减少 I/O 获得的时间更多的(已用)时间
  • 压缩对小文件无效,
  • 与格式无关的压缩对于原始(未压缩)音频或视频数据不是很有效1
  • 如果您的视频数据已经被压缩,那么第二次压缩将不会有任何效果。

最后,这可能是“大量小文件”问题。如果您尝试读取和写入大量小文件,瓶颈可能不是原始磁盘速度。相反,它可能是操作系统读取和写入目录和/或文件元数据的能力。如果这就是您的问题所在,那么您应该考虑将“大量小文件”捆绑到文件中;例如TAR 或 ZIP 文件。 Java 中有一些库可以执行此操作。

存档的另一个好处是它们可以使压缩更加有效。

<小时/>

1 - 有关背景信息,请阅读 https://en.wikipedia.org/wiki/Lossless_compressionhttps://en.wikipedia.org/wiki/List_of_codecs#Lossless_video_compression

关于java - GZIPOutputStream 与 BufferedOutputStream 的性能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46029229/

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