并行BZip2压缩

4

我正在使用Apache Commons Compress来压缩多个日志文件到一个tar.bz2归档文件中。

然而,由于我每天要压缩约20GB的文件,因此压缩时间非常长(> 12小时)。

由于这个库是单线程压缩文件的,所以我想知道是否有一种多线程的方法。

我找到了许多解决方案(命令行pbzip2或一些C ++库),但我在Java中找到的全部是这篇博客文章:

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

看起来我无法在我的Java应用程序中使用它。

还有其他可用的解决方案吗?你会推荐什么?或者是否有另一种类似bzip2的压缩率更高的更快速的解决方案?


我不知道这是否在你的能力范围内,但你可以尝试编写自己的多线程bzip2实现。 - Jesse Brands
嘿,杰西,是啊,那很棒,但那肯定超出了我的能力范围。 - Stefan
1
你考虑过在Java应用程序中调用http://compression.ca/pbzip2/吗? - reprogrammer
@reprogrammer 是的,那会奏效。如果没有其他解决方案,我会采取这种方法。 - Stefan
那就把它变成一个答案吧。 - reprogrammer
3个回答

2

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

注意:如果pbzip2可以满足您的需求,我建议从Java中调用它。您可能会发现即使使用一个线程,它也非常快,因为我见过的Java BZIP2库是本地实现的(与JAR、ZIP和GZIP不同)。


我有多个文件,但应该结果是一个大的tar.bz2文件 - 这样只需要压缩一个文件。 - Stefan
压缩文件是串行的,即基于之前发生的事情。我不知道其他库是如何解决这个问题的。你可以创建一个 .bz2.tar 文件。 - Peter Lawrey
@Peter Lawrey: 通常您首先使用tar来获取压缩,以跨越多个文件从而增加压缩比。 - MrSmith42
@MrSmith42 如果你这样做,就不能同时压缩部分内容。从文档上看,pbzip2似乎会创建一个压缩文件的tar文件。 - Peter Lawrey
@Peter Lawrey:没错。并行性只能在bzip2算法本身内部使用。 - MrSmith42

1

如果Java中没有并行实现bzip2,您可以在Java应用程序内调用pbzip2


0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接