我有一个我想通过网络发送的文本文件,这个文件的大小可能从1KB到500KB不等。
我可以使用哪些算法/技术在发送之前紧密压缩该文件,以便通过网络发送最少量的字节并且压缩率很高?
答案 0 :(得分:6)
对于压缩,我会考虑gzip,bzip2和LZMA(这不是一个详尽的列表,但这些是最着名的IMO。)
然后,我会在网上寻找一些基准测试,并尝试收集各种文件类型(文本,二进制,混合)和大小(小,大,巨)的指标。即使您最感兴趣的是压缩率,您也可以查看:压缩率,压缩时间,内存占用量,减压时间。
根据A Quick Benchmark: Gzip vs. Bzip2 vs. LZMA:
[...] gzip非常快,内存占用少。根据这个基准测试,bzip2和lzma在速度或内存使用方面都不能与gzip竞争。 bzip2具有比gzip更好的压缩率,这必然是bzip2普及的原因;它比gzip慢,特别是在解压缩时使用更多的内存。但是,即使在较旧的硬件上,bzip2的内存要求现在也应该没有问题。
[...]
LZMA显然有可能成为* NIX系统上第三种常用的普通purporse压缩格式。它主要通过提供明显更好的压缩比来与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和lzma 370MB。 lzma的减压时间为1m12s 和bzip2的1m48s。
最后,这是另一个带有图形结果的资源:Compression Tools: lzma, bzip2 & gzip
我真的建议您执行自己的工作台(因为您将只压缩文本,非常小到小文件)以在您的环境中获得真实的指标,但我敢打赌LZMA
不会在小文本文件上提供了显着的优势,因此bzip2
将是一个不错的选择(即使LZMA
的时间和内存开销在小文件上可能很低)。
如果您计划从Java执行压缩,您将找到LZMA
实现here,bzip2实现here(来自Apache Ant AFAIK),{{1}被包含在JDK中。如果您不想或不能依赖第三方库,请使用gzip。
答案 1 :(得分:4)
答案取决于内容。 GZip包含在jdk中。对随机字符串的测试似乎平均减少了33%。
[edit:content,not context]
答案 2 :(得分:0)
这取决于。你能控制网络数据包的大小吗?如果一个数据包超过1,你打算捆绑他们吗?你是否受到两端CPU的限制?不是真正的问题,但仍然相关,因为它可能需要更长的时间压缩&解压缩而不是有时发送字节。