【问题标题】:How to read a zip stream as fast as possible using threads?如何使用线程尽可能快地读取 zip 流?
【发布时间】:2015-04-23 09:55:00
【问题描述】:

我有一个 1GB 的 zip 文件,其中包含大约 2000 个文本文件。我想尽可能快地读取所有文件和所有行。

    try (ZipFile zipFile = new ZipFile("file.zip")) {
        zipFile.stream().parallel().forEach(entry -> readAllLines(entry)); //reading with BufferedReader.readLine();
    }

结果:stream.parallel() 比普通流快 30-50%。

问题:如果我不使用parallel API 读取流,而是显式触发我自己的线程以从文件中读取,我能否进一步优化性能?

【问题讨论】:

  • 难以置信。 ZIP 文件本质上是顺序的。线程在那里无济于事。您将获得的最大性能改进将是通过缓冲。
  • Afaik,最大的缺点是参考实现使用了一段不能多线程工作的本机代码。一旦输入被缓冲,即不是 I/O 占主导地位,这个实现细节将限制并行执行的好处。

标签: java multithreading zip java-8 java-stream


【解决方案1】:

也许吧。请记住,切换线程有点昂贵,而 Java 8 的 parallel() 相当不错。

解压缩 ZIP 流是 CPU 密集型的,所以更多的线程不会让事情变得更快。如果您创建自己的执行服务并仔细平衡线程数和内核数,您可能会找到比 Java 8 的 parallel() 更好的最佳位置。

剩下的另一件事是使用更好的缓冲策略来读取文件。但这对于 ZIP 档案来说并不容易。您可以尝试使用ZipInputStream 而不是ZipFile,但将流API 与Java 8 的Stream API ((de)compressing files using NIO) 混合使用并不容易。

【讨论】:

    猜你喜欢
    • 2012-01-11
    • 2017-03-06
    • 1970-01-01
    • 2021-10-26
    • 2016-07-25
    • 2016-04-16
    • 2015-09-25
    • 2011-11-17
    • 2011-12-22
    相关资源
    最近更新 更多