【问题标题】:When does it become worthwhile to spend the execution time to zip files?什么时候值得花费执行时间来压缩文件?
【发布时间】:2011-11-02 12:35:49
【问题描述】:

我们在一个应用程序中使用#ziplib(找到here),该应用程序为偶尔连接的客户端应用程序从服务器同步文件。

我的问题是,使用这种算法,什么时候值得花费执行时间来进行文件的实际压缩?据推测,如果只同步一个小文本文件,压缩时间将不足以减少传输的大小,实际上会减慢整个过程。

由于压缩时间配置文件会根据文件数量、文件类型和这些文件的大小而变化,有没有一种好方法可以通过编程方式发现何时应该压缩文件以及何时应该通过他们原样?在我们的应用程序中,文件几乎总是照片,尽管照片的类型和大小可能会发生变化。

我还没有编写实际的文件传输逻辑,但希望使用System.Net.WebClient 来执行此操作,但我也愿意使用替代方案来节省执行时间。

更新:随着讨论的发展,“压缩还是不压缩”是错误的问题吗?是否应该将重点放在用压缩的 WCF 流量或类似的东西替换旧的 System.Net.WebClient 方法?该实用程序的数据库同步部分已经使用 Microsoft Synchronization Framework 和 WCF,因此我当然对此持开放态度。我们现在可以做的任何限制网络流量的事情对我们的客户来说都是巨大的。

【问题讨论】:

  • 带 zip 的照片不会变小
  • 至少如果它们以已经压缩的格式存储,例如 jpeg 或 png。另一方面,未压缩的位图/TIF 可以压缩一点。
  • 我认为压缩是否有用主要取决于与上传带宽相比的可用 CPU 能力。看看许多国家/地区消费者互联网的可怕上传率,即使是很小的压缩率也可能是一个胜利。
  • 几率很低,特别是如果它是一个已经常规压缩的 http 传输。先让它在没有它的情况下工作,现在你可以在 1.1 版本中实际测试和比较
  • @adrianm 我正在开发的实用程序实际上是进入一个供多个应用程序使用的内部框架。当我说该应用程序仅处理照片时,那是相当短视的。我们还有其他应用程序可以同步各种文本格式的技术文档和紧急资源,最终也将使用这种新模型。

标签: c# .net zip sharpziplib


【解决方案1】:

要确定压缩文件是否有用,无论如何您都必须读取该文件。装上的时候还不如拉上拉链。

如果您想在不读取文件的情况下防止无用的压缩,您可以尝试根据其他属性预先决定它。

您可以创建一个“算法”来决定它是否有用,例如基于文件扩展名和大小。因此,可以压缩超过 1 KB 的 .txt 文件,但不应压缩 .jpg 文件,无论文件大小如何。但是创建这样一个列表需要做很多工作(您也可以创建一个黑名单或白名单,并允许 c.q. 拒绝所有不在列表中的文件)。

【讨论】:

    【解决方案2】:

    您可能有足够的 CPU 时间,所以唯一的问题是:它会缩小吗?

    如果您可以减少将保存在(磁盘和网络)I/O 上的文件。这很快就变得有利可图。

    唉,照片 (jpeg) 已被压缩,因此您可能看不到太多收益。

    【讨论】:

    • 网络流量是这里的大问题,因为我们在很多情况下都在与空中卡和电话网络上的人打交道。或许,更应该关注的是传输方式。您对压缩 WCF 流量与压缩文件有什么想法吗?
    【解决方案3】:

    您可以编写自己的非常简单的启发式分析,然后在每次下一个文件处理时重复使用它。应保存收集的统计信息,以保持重启之间的效率。

    基本界面:

    enum FileContentType
    {
      PlainText,
      OfficeDoc,
      OffixeXlsx
    }
    
    // Name is ugly so find out better
    public interface IHeuristicZipAnalyzer
    {
       bool IsWorthToZip(int fileSizeInBytes, FileContentType contentType);
       void AddInfo(FileContentType, fileSizeInBytes, int finalZipSize);
    }
    

    然后您可以通过使用AddInfo(...)添加有关刚刚压缩文件的信息来收集统计信息,并根据它可以通过调用IsWorthToZip(...)来确定是否值得压缩下一个文件

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-01-01
      • 2018-01-10
      • 2021-06-16
      • 1970-01-01
      相关资源
      最近更新 更多