我们在一个应用程序中使用#ziplib(找到here),该应用程序从服务器同步偶尔连接的客户端应用程序的文件。
我的问题是,使用这种算法,何时花费执行时间来进行文件的实际压缩是否值得?据推测,如果只有一个小文本文件正在同步,则zip的时间不足以减少传输的大小,实际上会减慢整个过程。
由于zip时间配置文件将根据文件数量,文件类型和这些文件的大小而发生变化,因此有一种很好的方法可以在我应该压缩文件时以编程方式发现我何时应该通过他们原样?在我们的应用程序中,文件几乎总是照片,但照片和大小的类型可能会发生变化。
我还没有编写实际的文件传输逻辑,但希望使用System.Net.WebClient
来执行此操作,但我也可以选择节省执行时间。
更新:随着讨论的发展,“拉链,或不拉链”是错误的问题?焦点应该是用压缩的WCF流量或类似的东西替换旧的System.Net.WebClient
方法吗?此实用程序的数据库同步部分已使用Microsoft同步框架和WCF,因此我当然对此持开放态度。我们现在可以做的任何限制网络流量的事情对我们的客户来说都是巨大的。
答案 0 :(得分:2)
要确定压缩文件是否有用,您无论如何都必须读取该文件。在它上面的时候,你也可以拉上它。
如果您想在不读取文件的情况下防止无用的压缩,您可以尝试根据其他属性事先确定它。
您可以创建一个'算法'来决定它是否有用,例如基于文件扩展名和大小。因此,可以压缩超过1 KB的.txt文件,但不管文件大小如何,都不应该使用.jpg文件。但创建这样的列表需要做很多工作(你也可以创建一个黑名单或白名单,并允许c.q.拒绝列表中没有的所有文件。)
答案 1 :(得分:1)
你可能有足够的CPU时间,所以唯一的问题是:它会缩小吗?
如果您可以减少文件,您将保存(磁盘和网络)I / O.这很快就会变得有利可图。
唉,照片(jpeg)已经被压缩,所以你可能看不到多少收益。答案 2 :(得分:0)
您可以编写自己非常简单的启发式分析,然后在每次下一次文件处理时重复使用它。应保存收集的统计信息,以保持重启之间的效率。
基本上是界面:
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(...)
来压缩下一个文件