Java中可序列化文件的最快压缩
Posted
技术标签:
【中文标题】Java中可序列化文件的最快压缩【英文标题】:Fastest compression for serialzable files in Java 【发布时间】:2011-03-20 15:15:26 【问题描述】:我有一堆文件(大约 4000 个),每个文件的重量或多或少在 1-5K 之间, 都是使用Java的序列化机制创建的。
我想将它们压缩并作为单个文件通过网络发送。 (总共大约 200-300MB)。
我正在寻找一种方法来提高压缩/解压缩速度,同时又不会对文件大小造成太大影响(因为它仍应通过网络发送并存储在服务器中)。
目前使用的是 Apache Ant 自带的 zip 包。 我读到 zip 文件存储每个文件的元数据,所以我猜 zip 文件不会是这里的最佳选择。
那么更可取的是什么? Gzip / 焦油? 还是根本不压缩? 对于这种情况,您会推荐哪个 java 库?
提前致谢。
【问题讨论】:
GZIP 对于 Amazon、Yahoo! 和 Google 来说已经足够好了。为什么这对你来说还不够好?如果您获得的节省没有被压缩和解压时间消耗掉,那么压缩将是有意义的。运行测试(或更多),看看是否属实。做一个实验主义者。 相信我,10 年后亚马逊和谷歌不会在他们的内部基础设施中使用 gzip )。 10年后的雅虎?呵呵。 【参考方案1】:完全不压缩会是最快的,但最终的文件大小是不利的。
tar.gz 产生的文件大小比单独使用 zip 更小的一个原因是 gzip 可以处理更大的数据缓冲区(整个 tar 文件),而在您的情况下,zip 只能处理来自一个一次一个文件(如果有很多文件,通常比 tar 文件的大小小很多)。
所以 gzip 可以一次压缩整本书的页面章节,而 zip 压缩一本书的每一章,然后将压缩的章节包装在一本书中 - 即压缩的对象集合通常小于压缩对象。
要产生与 tar.gz 类似的结果,您可以在第一遍中使用“存储”算法压缩文件,然后使用默认的 deflate 算法压缩生成的 zip 文件。
【讨论】:
【参考方案2】:很大程度上取决于您使用的网络。 如果它通过互联网 - 您最好发送(比如说)50个压缩文件而不是一个文件。如果您在一个文件中传输数据并且文件复制失败 - 您将不得不再次发送。
复制为单独的文件将允许您并行传输一些文件,并将大型上传失败的风险降至最低。
【讨论】:
【参考方案3】:另一种可能性可能是切换到另一种序列化机制。 JBoss 序列化与 API 和功能兼容,但产生的数据减少了 30%。
【讨论】:
以上是关于Java中可序列化文件的最快压缩的主要内容,如果未能解决你的问题,请参考以下文章