将 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# 时的性能问题的主要内容,如果未能解决你的问题,请参考以下文章

通过 C# 导入 Excel 文件时的性能瓶颈

C# - 提高搜索时的性能

7z命令行问题

使用 ADO 将大型 csv 文件导入 mdb 时的性能问题

将数据从 Databricks 加载到 Azure SQL 时的性能问题

7z 无法提取包含 ZipFile.CreateFromDirectory 的 .zip 文件