.Net多线程解压缩

El *_*ark 1 .net compression

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

我发现的所有库都是单螺纹减压.

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

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


附加信息:正在压缩的数据是SQL Server数据库备份~30 Gb,从SQL Server备份命令(VDI)通过ZipOutputStream流式传输到FileStream.

Che*_*eso 7

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

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


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

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

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