Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/338.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java GZIPOutputStream与BufferedOutputStream的性能比较_Java_Gzipoutputstream_Bufferedoutputstream - Fatal编程技术网

Java GZIPOutputStream与BufferedOutputStream的性能比较

Java GZIPOutputStream与BufferedOutputStream的性能比较,java,gzipoutputstream,bufferedoutputstream,Java,Gzipoutputstream,Bufferedoutputstream,我的应用程序正在将大量视频和i2c传感器数据记录到一个磁盘文件中—尽可能快。目前,我正在将所有内容转换为字节,并使用BufferedOutputStream进行写入@Siguza好心地建议寻找GZIPOutputStream来完成这项任务。我想知道你是否对性能问题有任何想法,赞成和反对。。。我认为处理器是遥遥领先的,而磁盘写入是瓶颈——因此我希望在写入之前通过GziOutputStream进行动态压缩可能是一个不错的策略。对此有任何想法,我们都非常欢迎 补充:回应评论 事实证明,压缩并没有处理器

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

补充:回应评论

事实证明,压缩并没有处理器那么昂贵。。。正如埃尔文正确指出的那样,我问最初问题的方式并不好。压缩性能的问题不在BufferedOutputStream和GZIPOutputStream之间。。。压缩流和解压缩流都需要打包到BufferedOutputStream中,但是如果原始FileOutputStream在打包到BufferedOutputStream之前先打包到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();


很好…

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

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

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

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

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

但缺点是:

  • 压缩相对来说比较昂贵(解压缩也是如此),因此最终使用的时间可能比通过减少I/O获得的时间要长
  • 压缩对小文件无效
  • 格式无关压缩对原始(未压缩)音频或视频数据不是很有效1
  • 如果您的视频数据已经被压缩,那么第二次压缩将一无所获
最后,这可能是一个“很多小文件”的问题。如果您试图读写大量的小文件,瓶颈可能不是原始磁盘速度。相反,它可能是操作系统读取和写入目录和/或文件元数据的能力。如果这就是你的问题所在,那么你应该考虑将“大量的小文件”打包成档案;e、 g.TAR或ZIP文件。在Java中有用于执行此操作的库

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



1-关于背景,请阅读和

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

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

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

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

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

但缺点是:

  • 压缩相对来说比较昂贵(解压缩也是如此),因此最终使用的时间可能比通过减少I/O获得的时间要长
  • 压缩对小文件无效
  • 格式无关压缩对原始(未压缩)音频或视频数据不是很有效1
  • 如果您的视频数据已经被压缩,那么第二次压缩将一无所获
最后,这可能是一个“很多小文件”的问题。如果您试图读写大量的小文件,瓶颈可能不是原始磁盘速度。相反,它可能是操作系统读取和写入目录和/或文件元数据的能力。如果这就是你的问题所在,那么你应该考虑将“大量的小文件”打包成档案;e、 g.TAR或ZIP文件。在Java中有用于执行此操作的库

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



1-阅读背景资料,然后

是什么阻止你尝试测试?无论如何,BufferedOutputStream和GZIPOutputStream是完全不同的野兽,可以组合。如果你有很多小的写操作,前者可以优化事情,后者可以减少压缩数据的空间消耗——而使用专门的视频编解码器压缩视频要好得多。它们是不可比较的。问题还在于您是否希望压缩这些文件。下游系统能解压吗?多谢了,我不是在压缩视频流本身,而是从中提取的数据——比如进入headsup显示器的信息,或者叠加到流上以增强它。数据都是字节、整数和字符串。每个记录大约有20个字节。以10 fps的速度运行10分钟,文本大小为400kB,当减少到重要字节时为120kB。缩小和压缩时为26kB。带宽节约看起来确实不错,只是关于如何在这种情况下最佳优化性能的问题我不太清楚。解压步骤对我来说不是什么大问题,因为这对时间不太重要。有人看到使用GZIPOutputStream的主要缺点吗?什么阻止了你尝试考试?无论如何,BufferedOutputStream和GziOutputStream是完全不同的动物,可以
FileInputStream fin = new FileInputStream(datFile);
GZIPInputStream gin = new GZIPInputStream(new FileInputStream(datFile));