【问题标题】:Parallel BZip2 Compression并行 BZip2 压缩
【发布时间】:2012-12-12 08:23:55
【问题描述】:

我正在使用Apache Commons Compress for Java 将多个日志文件压缩为单个tar.bz2存档。

但是,压缩需要很长时间(> 12 小时),因为我每天压缩大约 20GB 的文件。

由于这个库压缩文件是单线程的,我想知道是否有办法做到这一点。

我找到了很多解决方案(命令行 pbzip2 或一些 C++ 库),但我为 java 找到的只是这篇博文:

https://plus.google.com/117421466255362255970/posts/3jfKVu325zh

我的 Java 应用程序中似乎无法使用它。

那里有什么吗?你会推荐什么?或者是否有另一种更快的解决方案,具有类似的压缩率,例如 bzip2?

【问题讨论】:

  • 我不知道这是否在你的能力范围内,但你总是可以尝试编写自己的 bzip2 多线程实现?
  • 嘿,杰西,是的,那会很膨胀,但那肯定是我够不着的。
  • 如何在 Java 应用程序中调用 compression.ca/pbzip2
  • @reprogrammer 是的,这样就可以了。如果没有其他解决方案,我会采取这种方法
  • 然后把它变成一个答案。

标签: java parallel-processing compression bzip2 apache-commons-compress


【解决方案1】:

由于您有多个文件,您可以在不同的线程中压缩每个文件。由于您的进程受 CPU 限制,我建议创建一个固定大小的线程池,即 ExecutorService,并为每个要压缩的文件添加一个任务。

注意:如果 pbzip2 符合您的要求,我会从 Java 中调用它。你可能会发现它对于一个线程来说也很快,因为我看到的 Java 的 BZIP2 库是本地实现的(不像 JAR、ZIP 和 GZIP)

【讨论】:

  • 我有多个文件,但它应该会生成一个大的 tar.bz2 文件 - 所以它只是一个要压缩的文件
  • 压缩文件是串行的,即。基于之前发生的事情。我不知道其他图书馆如何解决这个问题。您可以创建一个 .bz2.tar 文件。
  • @Peter Lawrey:通常,您首先执行 tar 以使压缩跨越多个文件以提高压缩率。
  • @MrSmith42 但是如果你这样做,你就不能并行压缩部分。查看文档,似乎 pbzip2 创建了一个压缩文件的 tar 文件。
  • @Peter Lawrey:没错。并行性只能在 bzip2 算法本身内使用。
【解决方案2】:

如果 bzip2 在 Java 中的并行实现没有退出,您可以求助于从 Java 应用程序中调用 pbzip2

【讨论】:

    【解决方案3】:

    尝试 BZip2OutputStream 的 at4j 实现。根据手册,它支持并行压缩。 http://at4j.sourceforge.net/releases/current/pg/ch04.xhtml

    【讨论】:

      猜你喜欢
      • 2011-01-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-06-08
      • 1970-01-01
      • 1970-01-01
      • 2022-06-16
      相关资源
      最近更新 更多