Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/clojure/3.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中的任何类型的OutputStream实现尽可能高的性能?_Java_Performance_Api - Fatal编程技术网

如何使用java中的任何类型的OutputStream实现尽可能高的性能?

如何使用java中的任何类型的OutputStream实现尽可能高的性能?,java,performance,api,Java,Performance,Api,我需要写数据块(字符),我不关心这些数据块的顺序。我想知道我应该使用什么类型的OutputStream来实现高性能?您可以创建一个包装类,即扩展ZipoutStream,并通过覆盖它们来同步方法。例如: class MyZip extends java.util.zip.ZipOutputStream { synchronized public void write(byte[] b, int off, int len) throws IOException { super.wri

我需要写数据块(字符),我不关心这些数据块的顺序。我想知道我应该使用什么类型的OutputStream来实现高性能?

您可以创建一个包装类,即扩展ZipoutStream,并通过覆盖它们来同步方法。例如:

class MyZip extends java.util.zip.ZipOutputStream {

  synchronized public void write(byte[] b, int off, int len) throws IOException {
    super.write( b, off, len);
  }

}
或者,您可以使用现有的解决方案


更新:我假设一个线程将打开流和条目,然后许多线程将写入,然后一个线程将关闭它。

您可以创建一个包装类,即扩展ZipoutStream,并通过覆盖它们使方法同步。例如:

class MyZip extends java.util.zip.ZipOutputStream {

  synchronized public void write(byte[] b, int off, int len) throws IOException {
    super.write( b, off, len);
  }

}
或者,您可以使用现有的解决方案


更新:我假设一个线程将打开流和条目,然后许多线程将写入,然后一个线程将关闭它。

仅从多个线程调用一个香草ZipoutStream是不可行的。ZipOutputStream API有一个模型,您可以一次编写一个条目,如下所示:

ZipOutputStream zos = ...

while (...) {
    zos.putNextEntry(...);
    while (...) {
       zos.write(...);
    }
    zos.closeEntry();
}
此模型本质上是非线程安全的


为了以线程安全的方式执行此操作,您需要将ZipOutputStream封装在一个类中,该类在一个同步方法调用中执行put/write/close操作。这意味着您实际上是在连续地执行Zip输出操作,这在很大程度上违背了您执行此操作的目的。

仅从多个线程调用一个香草ZipoutStream是行不通的。ZipOutputStream API有一个模型,您可以一次编写一个条目,如下所示:

ZipOutputStream zos = ...

while (...) {
    zos.putNextEntry(...);
    while (...) {
       zos.write(...);
    }
    zos.closeEntry();
}
此模型本质上是非线程安全的


为了以线程安全的方式执行此操作,您需要将ZipOutputStream封装在一个类中,该类在一个同步方法调用中执行put/write/close操作。这意味着您实际上是在连续地执行Zip输出操作,这在很大程度上违背了您这样做的目的。

在执行并行图像压缩算法时,我遇到了类似的情况。您可以创建大量内存块作为输出流,并将压缩后的数据保存到这些内存块中,然后将它们连接起来。其他并行压缩算法(如将压缩的块保存到文件中)也会这样做,但在压缩结束时,排序任务会将所有块连接在一起。

在执行并行图像压缩算法时,我遇到了类似的情况。您可以创建大量内存块作为输出流,并将压缩后的数据保存到这些内存块中,然后将它们连接起来。其他并行压缩算法(如将压缩的块保存到文件)也会这样做,而在压缩结束时,排序任务会将所有块连接在一起。

对于大多数情况,使用大缓冲区可能是最好的选择,但实际使用的是字节(如果要写入字符/字符串,请使用BufferedWriter).

注意:这的绝对性能将取决于堆大小、操作系统、垃圾收集器、缓冲区大小、月亮的相位等。。。但一般来说,这比一个字节一个字节地写要好

正如您所说,您不知道序列,我可能误解了您真正想要做的事情,因为这些显然是以顺序的方式操作的。

在大多数情况下,使用大缓冲区可能是最好的选择,但实际上它使用字节(如果您想写字符/字符串,请使用BufferedWriter)

注意:这的绝对性能将取决于堆大小、操作系统、垃圾收集器、缓冲区大小、月亮的相位等。。。但一般来说,这比一个字节一个字节地写要好


正如你所说的,你不知道顺序,我可能误解了你真正想要做的事情,因为这些显然是以顺序的方式操作的。

@Viliam:你的第一个解决方案行不通。您需要在一个同步调用中执行putNextEntry/write/closeEntry。@Stephen C:否。Roam需要异步写入字符块。不是多个文件。将putNextEntry/write/closeEntry放入一个同步块会彻底破坏它。@Viliam:好的。。。这是对这个问题的合理解释。但我真的不认为他/她是这个意思。为什么他/她会使用ZIP流而不是(比如)普通流或具有更好压缩算法的流?@Stephen C:那是因为问题已经改变了!:)第一个版本明确要求使用ZipoutStream,而这个版本(在我发布的答案之后编辑)只涉及OutputStream。我想这是活生生的…@Viliam:你的第一个解决方案行不通。您需要在一个同步调用中执行putNextEntry/write/closeEntry。@Stephen C:否。Roam需要异步写入字符块。不是多个文件。将putNextEntry/write/closeEntry放入一个同步块会彻底破坏它。@Viliam:好的。。。这是对这个问题的合理解释。但我真的不认为他/她是这个意思。为什么他/她会使用ZIP流而不是(比如)普通流或具有更好压缩算法的流?@Stephen C:那是因为问题已经改变了!:)第一个版本明确要求使用ZipoutStream,而这个版本(在我发布的答案之后编辑)只涉及OutputStream。我想这是活的……您可能会在
ZipOutputStream
前面有某种类,它要么同步,要么为了更好的性能,将文件条目排队到一个专用(每个zip)线程上。@Tom:我是这么说的,不是吗?(我可以看出,专用线程可能会提供更好的吞吐量……如果应用程序是I/O绑定的,但是通过增加创建要编写的内容的工作线程的数量,您会得到相同的效果。)@Stephen:不。您说的是一个同步方法调用。Tom指出可以将文件条目排队。OP不要求高性能,只要求concurre