【问题标题】:fastest way to extract .zip archive提取 .zip 档案的最快方法
【发布时间】:2011-08-04 14:39:09
【问题描述】:

解压 .zip 档案最快的方法是什么?我的应用程序的性能很大程度上取决于 .zip 文件的提取速度。我正在使用 dotNetzip atm,但似乎可以有更多更快的工具。如果有,它们安全吗?我听说 QuickLZ 是最快的,但没有测试过,也没有找到任何代码示例或如何在 c# 中使用它。任何帮助将不胜感激。

【问题讨论】:

  • 关于 我的应用程序的性能很大程度上取决于 .zip 文件的提取速度 - 如果您进一步描述,我们可能会对如何优化提出一些建议。您是否尝试过 DotNetZip 中的“最快压缩”级别?如果您可以控制压缩方面,则可以使用较不通用的压缩方法,如果您的数据受到某种方式的限制,也可以更快地解压缩。
  • 太糟糕了,我必须提取已经被其他软件压缩的文件,所以我不能选择较低的压缩级别。
  • 在我的应用程序中,main 方法运行所花费的时间大约有一半用于提取 .zip 档案,因此提高提取时间将是一个很好的性能提升。提取后,我需要访问这些文件上的一些元数据,然后根据元数据将它们移动到其他位置。
  • 在提取 ZIP 文件时,您的主要方法是否需要/可以做其他事情?如果可以选择,可能值得将提取转移到后台工作程序、线程或异步调用以提高性能
  • 提取方法已经在backgroundworker中,但是由于应用程序需要提取数据来执行下一个功能,所以我仍然需要它等待,同时正在提取数据。

标签: c# .net zip extract performance


【解决方案1】:

您的 zip 文件有多大?也许您可以利用现代多核处理器,将原始文件拆分为多个部分,独立压缩每个部分,然后使用多线程将它们解压缩到您的应用程序中。与解压缩时间相比,在内存中重新组合文件的时间会很短。

【讨论】:

  • Zip 文件大小约为 500 MB 到 1.5 GB。所以你认为我应该从原始文件创建 2 个 zip 文件,然后分别提取它们?
  • 如果您已经有一个 zip 文件开始,那么这个答案没有意义,因为您无法控制用户将如何创建他们的 zip 文件。如果您决定“将原始文件拆分为多个部分”,您仍然需要提取原始文件,然后才能创建多个部分 zip 文件,这显然是浪费时间。
【解决方案2】:

使用 DotNetZip 库,您可以使用 ExtractAll() 方法提取所有文件:)

【讨论】:

    【解决方案3】:

    如果可以选择将项目升级到 .NET 4.5,则可以使用 ZipArchive 类。 I wrote an article 使用它,它非常简单。还有ZipFileI also wrote about,更简单。不过,我无法对性能发表评论,因为我没有使用第三方库进行 ZIP 存档。

    【讨论】:

    • 博客链接已失效。
    【解决方案4】:

    在进行我们自己的测试时,7-zip CLI(exe 文件)是迄今为止最快的。 CLI 应用程序的性能优于所有这些 .NET dll 听起来很疯狂,但不幸的是事实就是如此。

    确切地说,我已经使用 ZipFile 和 ZipArchive 测试了 SharpCompress、SharpZipLib、DotNetZip、.NET 自己的实现。对于我们的测试文件,它们都运行了大约 10-20 秒,但 7-zip 的 exe 进程通常在 7-8 秒完成。

    这是一个示例代码,如果您决定使用 7-zip:

        private static void ExtractWith7Zip(string archivePath, string extractPath)
        {
            var info = new ProcessStartInfo
            {
                FileName = @"C:\Program Files\7-Zip\7z.exe",
                Arguments = $"x -y -o\"{extractPath}\" \"{archivePath}\"",
                WindowStyle = ProcessWindowStyle.Hidden,
                CreateNoWindow = true,
                UseShellExecute = false,
                RedirectStandardOutput = true
            };
    
            Process.Start(info)?.WaitForExit();
        }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-10-01
      • 2016-08-03
      • 1970-01-01
      • 1970-01-01
      • 2012-06-13
      • 2018-06-25
      • 2023-01-26
      相关资源
      最近更新 更多