将 7z 文件提取到目录 c# 时的性能问题
Posted
技术标签:
【中文标题】将 7z 文件提取到目录 c# 时的性能问题【英文标题】:Performance issues at extracting 7z file to a directory c# 【发布时间】:2017-01-13 12:51:02 【问题描述】:我正在使用 SharpCompress 库来提取 .7z 文件,但提取 60mb .7z 文件大约需要 35 分钟。这是正常的还是我在性能方面做错了什么? .7z 文件以高压缩模式和 LZMA 类型压缩。
using (var archive2 = ArchiveFactory.Open(source))
foreach (var entry in archive2.Entries)
if (!entry.IsDirectory)
entry.WriteToDirectory(destination, ExtractOptions.ExtractFullPath | ExtractOptions.Overwrite);
【问题讨论】:
询问计算中的正常性是基于太多的参数,所以回答这个问题没有多大价值。也许您可以将其改写为“我认为这花费了太长时间。是否可以加快速度?”我认为这会更容易回答 生成的文件有多大? CPU负载有多高?在单线程模式下用7-zip之类的程序解压文件需要多长时间?您可能只是计算机速度较慢,或者生成的文件太大。 @PanagiotisKanavos 结果文件为 60.5 mb,Cpu 负载约为 %15 60MB 是 7z 文件。未压缩的数据有多大? 不抱歉。 60Mb 是未压缩的数据。 11.7Mb 是压缩数据 【参考方案1】:这是一个旧帖子,但我也遇到了同样的问题。
这行是问题
foreach (var entry in archive2.Entries)
问题描述here(即,如果有100个文件,它会解压第一个文件100次,第二个文件99次,以此类推)
解决方案是使用阅读器(仅转发)。请参阅API。 但是那里的示例代码不支持7z。
对于 7z,您可以使用 archive.ExtractAllEntries()
,例如。
using (var archive = ArchiveFactory.Open(movedZipFile))
var reader = archive.ExtractAllEntries();
while (reader.MoveToNextEntry())
if (!reader.Entry.IsDirectory)
reader.WriteEntryToDirectory(extractDir, new ExtractionOptions() ExtractFullPath = false, Overwrite = true );
会快很多。
【讨论】:
以上是关于将 7z 文件提取到目录 c# 时的性能问题的主要内容,如果未能解决你的问题,请参考以下文章
使用 ADO 将大型 csv 文件导入 mdb 时的性能问题