GZIPOUTPUTSTREAM与BufferedOutputStream的性能



我的应用程序正在将视频和i2c传感器数据记录到磁盘文件中 - 尽可能快。目前,我正在将所有内容转换为字节,并且正在使用BufferedOutputStream编写。@siguza非常友善,可以建议您研究GZIPOUTPUTSTREAM来完成契约。我想知道您是否对绩效问题和骗局有任何想法...我认为处理器正在前进,并且磁盘写入是瓶颈 - 所以我希望在写入之前,通过gzipoutputstream即时进行压缩一个好的策略。对此的任何想法都非常受欢迎。

添加:响应评论...

事实证明,拉链并不是那个处理器昂贵的...正如欧文正确指出的那样,我问的原始问题的方式并不好。关于拉链性能的问题不在bufferedOutputstream和gzipoutputstream之间... zippert和未拉链的流都需要包装到bufferedOutputstream中,但是如果原始的fileOutputStream首先包裹在gzipoutputStream中,则添加了多少成本包裹在一个缓冲的图像中。这是答案。我正在使用代码

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 int的写作

zipped = true 38ms -Filesize 4MB
zipped = false in 21ms- filesize 4kb

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

阅读灌注几乎相同83 vs 86ms

FileInputStream fin = new FileInputStream(datFile);

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

都很好...

这个问题提出了很多问题:

我认为处理器处于领先地位,并且磁盘写入是瓶颈

"我在想"不是优化性能的合理基础。您需要进行一些测量,以找出瓶颈实际上在哪里。(如果您的"思考"是错误的,那么更改为gzipoutputstream很容易使事情变得更糟。)

另外,只需尝试一下,测量它是否改善了性能。

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

但缺点是:

  • 压缩相对昂贵(减压也是如此),因此您最终可能会使用比减少I/O
  • 获得更多(经过的)时间(经过的时间)
  • 压缩在小文件上无效,
  • 格式 - 不合时式压缩在RAW(未压缩)音频或视频数据 1
  • 上不是很有效
  • 如果您的视频数据已经被压缩,那么第二个压缩将一无所获。

最后,这可能是一个"很多小文件"问题。如果您尝试读取很多小文件,则瓶颈可能不是原始磁盘速度。相反,它很可能是OS读写目录和/或文件元数据的能力。如果那是您的问题所在,那么您应该考虑将"很多小文件"捆绑到档案中;例如焦油或zip文件。有库在Java中进行此操作。

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


1-对于背景,请阅读https://en.wikipedia.org/wiki/wiki/lossless_compression和https://en.wikipedia.org/wiki/wiki/wiki/list_of_codecs#lossless_video_video_video_compression

/div>

最新更新