【问题标题】:Sending text file over network with high compression通过网络发送具有高压缩率的文本文件
【发布时间】:2009-09-11 22:40:25
【问题描述】:

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

【问题讨论】:

  • 您是在看发送时压缩,所以它会是流压缩,还是花时间压缩,然后发送,然后接收,解压缩,然后处理?

标签: java text networking compression


【解决方案1】:

对于压缩,我会考虑 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。

【讨论】:

    【解决方案2】:

    答案取决于内容。 GZip 包含在 jdk 中。对随机字符串的测试似乎平均减少了 33% 的大小。

    [编辑:内容,而非上下文]

    【讨论】:

    • 是否依赖 GZIP 浏览器?我在这里没有使用浏览器,只是一个自给自足的 java 客户端与远程 servlet 通信。
    • Java 具有内置的功能(因为 Jar 文件)。它应该始终可用。
    • 这是一个标准功能。见java.sun.com/javase/6/docs/api/java/util/zip/…
    【解决方案3】:

    这取决于。你能控制网络数据包的大小吗?如果超过 1 个可以装在一个数据包中,你会捆绑它们吗?您是否受到两端 CPU 的限制?不是真正的问题,但仍然相关,因为压缩和解压缩有时比发送字节需要更长的时间。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-06-23
      • 2011-06-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多