繁体   English   中英

GZIPOutputStream与BufferedOutputStream的性能

[英]performance of GZIPOutputStream vs BufferedOutputStream

我的应用程序将大量视频和i2c传感器数据记录到磁盘文件中-尽快。 目前,我正在将所有内容转换为字节,并且正在使用BufferedOutputStream编写。 @Siguza非常友善,建议研究一下GZIPOutputStream以完成任务。 我想知道您是否对性能问题有任何正面和反面的想法...我认为处理器处于领先地位,而磁盘写操作是瓶颈-所以我希望在写操作之前通过GZIPOutputStream快速压缩一个好的策略。 任何对此的欢迎。

补充:回应评论...

事实证明,压缩并不是处理器的昂贵……而且,正如erwin正确指出的那样,我问原始问题的方式并不好。 有关压缩性能的问题不在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个整数

以38ms压缩= true-文件大小4MB
以21ms压缩= false-fileSize 4KB

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

读取性能几乎是相同的83 vs 86ms之间

FileInputStream fin = new FileInputStream(datFile);

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

都好 ...

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

我认为处理器是领先者,而磁盘写入是瓶颈

“我在思考”不是优化性能的可靠依据。 您需要进行一些测量以找出瓶颈所在。 (如果您的“想法”是错误的,那么更改为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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM