.Net多线程解压缩

时间:2011-08-17 21:09:31

标签: .net compression

我正在使用DotNetZip库来压缩Zip文件中的数据流以进行存储。 DotNetZip能够压缩多线程,而且很好用。快。

我发现的所有图书馆都是单线程减压。

这是ZIP格式的一般缺点吗? .Net世界中是否有多线程解压缩功能? (使用Stream接口?)

如果没有..是否有技术原因导致无法实施?


其他信息: 正在压缩的数据是SQL Server数据库备份,大小为30 Gb,从SQL Server备份命令(VDI)通过ZipOutputStream流式传输到FileStream。

2 个答案:

答案 0 :(得分:6)

这不是技术上的不可能性。

DotNetZip不进行多线程解压缩,因为我从未实现过它。 MT压缩是首要任务;我做到了我只是没有费心去做MT减压。压缩通常是比解压缩更耗费CPU和更昂贵的操作;对于ZIP存档中使用的典型压缩算法DEFLATE尤其如此,因为搜索要求。虽然我不是压缩算法专家,但我猜想类似的特性会适用于其他压缩算法。在解压缩期间不需要搜索,因此解压缩通常相对更快。因此,在DotNetZip中优化解压缩不是优先考虑的问题。


附注:DotNetZIp中的并行压缩是在单个文件上完成的:假设您有一个1000块的文件(对于任意块长度)。 DotNetZip将在压缩中登记多个线程,每个线程压缩一个块。因为压缩机线程独立运行,所以例如,块6的压缩可能在块4的压缩之前完成。因此,主线程负责将压缩块重新组装回正确的顺序,然后将它们写入输出流。

这样,在库开始压缩下一个条目之前,zip存档中的每个条目(文件)都会被完全压缩。在压缩期间有明显的机会应用额外的并行度:并行压缩多个条目。 DotNetZip现在不这样做。当创建的zipfile包含大量较小的文件时,这种并行方法是有意义的,而今天的并行压缩DotNetZip当zip文件包含任意数量的较大文件(大于512k左右)时才有意义。

今天使用DotNetZip,在典型的现代笔记本电脑上,CPU在压缩大文件时会变得饱和,大文件大于10块,典型的块大小为512k。因此,添加新级别的并行性根本不会加速这种情况。但它有助于将70,000个小文件压缩到一个存档中。

答案 1 :(得分:1)

这不是格式的缺点。 zip格式专为随机访问而设计。我没有技术上的理由可以认为您无法同时提取多个文件。关于它的wikipedia page在格式上非常详细。

我能想到它在.NET中是单线程的唯一原因是,一个流(本质上是串行的)可以在它进入时解压缩。显然,不能多线程可用。