通过高压缩网络发送文本文件

时间:2009-09-11 22:40:26

标签: java text networking compression

我有一个我想通过网络发送的文本文件,这个文件的大小可能从1KB到500KB不等。
我可以使用哪些算法/技术在发送之前紧密压缩该文件,以便通过网络发送最少量的字节并且压缩率很高?

3 个答案:

答案 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的限制?不是真正的问题,但仍然相关,因为它可能需要更长的时间压缩&解压缩而不是有时发送字节。