Java中的多线程解压缩

JAK*_*AKJ 7 java multithreading zlib inflate

所以,我试图用Java对zip文件进行只读访问,以多线程方式解压缩,因为我使用枚举和输入流的ZipFile/ZipEntry的标准简单单线程解决方案和什么不导致它采取大约五个完整的秒钟,只需要将一个50兆的zipfile解压缩到内存中,这需要一秒钟的AT MOST让我的磁盘无需解压缩即可读取.

然而,整个Java zip库被同步到令人难以置信的令人讨厌的程度,毫无疑问,因为它完全被抽象用于读/写等.在相同的代码中,而不是具有良好的有效非同步只读代码.

我看过第三方Java库,它们都是大型的VFS库,比使用大象枪射击苍蝇更糟糕,或者它们具有性能优势的唯一原因是它们多线程到达无论如何,大多数线程都在磁盘IO上阻塞.

我想要做的就是将zipfile拉入byte [],分叉一些线程,然后处理它.没有理由以任何方式对任何事情进行任何同步,因为我在内存中单独使用的每个解压缩文件没有交互.

为什么一定要这么难?

Tho*_*lut 3

使用 Java 实现这一点的最快方法是使用 NIO。您可以使用MappedByteBuffer.

FileChannel channel = FileChannel.open(Paths.get("/path/to/zip"),
    StandardOpenOption.READ);
MappedByteBuffer buffer = channel.map(MapMode.READ_ONLY, 0, channel.size());
Run Code Online (Sandbox Code Playgroud)

现在buffer包含整个文件的内存映射区域。您可以用它做任何您想做的事情,例如传递 anoffset和 alength传递给线程。我不知道哪个 zip 库支持这一点,但显然你已经有了类似的东西。

仅供参考,我用 50 MB 的单文件存档进行了一些测试,用通常的方式读取它平均花费了不到 200 毫秒ZipInputStream- 我认为您在这里几乎没有尝试优化任何内容。