【发布时间】:2009-09-11 22:40:25
【问题描述】:
我有一个要通过网络发送的文本文件,该文件的大小可能从 1KB 到 500KB 不等。
在发送此文件之前,我可以使用哪些算法/技术对其进行紧密压缩,以便通过网络发送的字节数最少并且压缩率很高?
【问题讨论】:
-
您是在看发送时压缩,所以它会是流压缩,还是花时间压缩,然后发送,然后接收,解压缩,然后处理?
标签: java text networking compression
我有一个要通过网络发送的文本文件,该文件的大小可能从 1KB 到 500KB 不等。
在发送此文件之前,我可以使用哪些算法/技术对其进行紧密压缩,以便通过网络发送的字节数最少并且压缩率很高?
【问题讨论】:
标签: java text networking compression
对于压缩,我会考虑 gzip、bzip2 和 LZMA(这不是一个详尽的列表,但这些是 IMO 最著名的)。
然后,我会在网上寻找一些基准,并尝试收集各种文件类型(文本、二进制、混合)和大小(小、大、巨大)的指标。即使您对压缩率最感兴趣,您也可能需要查看:压缩率、压缩时间、内存占用、解压缩时间。
根据A Quick Benchmark: Gzip vs. Bzip2 vs. LZMA:
[...] gzip 速度非常快,内存占用也很小。根据这个基准,无论是 bzip2 还是 lzma 在速度或内存使用方面都无法与 gzip 竞争。 bzip2 的压缩比明显优于 gzip,这应该是 bzip2 流行的原因;它比 gzip 慢,尤其是在解压缩时,并且使用更多内存。但是,即使在较旧的硬件上,bzip2 的内存需求现在也应该没有问题。
[...]
LZMA 显然有可能成为 *NIX 系统上第三种常用的通用压缩格式。它主要与 bzip2 竞争,提供明显更好的压缩比,同时仍保持与 gzip 相对接近的解压缩速度。
这在LZMA - better than bzip2中得到确认:
描述令人印象深刻,在 简短:
- 更好的压缩比(gzip 时具有最佳压缩级别 达到 38%,bzip2 34%,LZMA 有 25%)。
- 压缩比增益可见主要在二进制文件上。
- 解压缩时间比 bzip2 快得多(3-4 倍)。
- 算法允许并行执行(但工具 我将在此处描述为单线程)。
也有缺点:
- 压缩(不包括较低级别)比 bzip2 慢得多。
- 压缩过程中的内存需求比 bzip2 大得多。
所以,对于文本文件的压缩,同一个站点报告:
我使用 LZMA 的第一件事是 压缩我的邮件存档。垃圾邮件 我选择的文件(mbox 格式的邮件)是 528MB 大,我将使用最大 压缩率。压缩期间 lzma 进程有 370MB 大,那是 很多:) bzip2 低于 7MB。花了 压缩文件大约需要 15 分钟 由 lzma 不到 4 分钟 bzip2.压缩比非常 类似:输出文件为 373MB bzip2 和 370MB 用于 lzma。 lzma的减压时间为1m12s bzip2 为 1m48s。
最后,这里是另一个带有图形结果的资源:@987654323@
我真的建议执行您自己的工作台(因为您将只压缩文本和非常小的文件)以在您的环境中获得真正的指标,但我敢打赌LZMA 不会提供在小文本文件上具有显着优势,因此bzip2 将是一个不错的选择(即使LZMA 的时间和内存开销在小文件上可能很低)。
如果您计划从 Java 执行压缩,您会发现 LZMA 实现 here、bzip2 实现 here(来自 Apache Ant AFAIK)、gzip 包含在 JDK 中。如果您不想或不能依赖第三方库,请使用 gzip。
【讨论】:
答案取决于内容。 GZip 包含在 jdk 中。对随机字符串的测试似乎平均减少了 33% 的大小。
[编辑:内容,而非上下文]
【讨论】:
这取决于。你能控制网络数据包的大小吗?如果超过 1 个可以装在一个数据包中,你会捆绑它们吗?您是否受到两端 CPU 的限制?不是真正的问题,但仍然相关,因为压缩和解压缩有时比发送字节需要更长的时间。
【讨论】: