【问题标题】:How can I reduce the time taken to extract files?如何减少提取文件所需的时间?
【发布时间】:2014-01-27 17:29:45
【问题描述】:

我用 C# 编写了一个程序,它处理大约 30 个压缩文件夹,总共有大约 35000 个文件。我的目的是读取每个文件以处理其信息。截至目前,我的代码提取所有文件夹,然后读取文件。这个过程的问题是它需要大约 15-20 分钟才能发生,这很长。

我正在使用以下代码提取文件:

void ExtractFile(string zipfile, string path)
{
    ZipFile zip = ZipFile.Read(zipfile);
    zip.ExtractAll(path);
}

提取部分是处理时间最长的部分。我需要减少这个时间。有没有一种方法可以读取压缩文件夹中文件的内容而不提取它们?或者如果有人知道任何其他方法可以帮助我减少这段代码的时间?

提前致谢

【问题讨论】:

  • 当然,您正在读取同一个文件两次,您是否尝试过使用本机 windows api 或其他比 .net zip 类运行速度更快的 dll。
  • 对不起,我写错了两次。我会改正的
  • 也许ZipArchive [msdn.microsoft.com/en-us/library/… 是您正在寻找的。它有GetEntry之类的方法,ZipArchiveEntry可以是Opened
  • 如果我使用 GetEntry() 那么我可以在不提取的情况下读取该文件的内容吗?
  • 是的,我正在使用 DotNetZip

标签: c# extract zipfile dotnetzip


【解决方案1】:

您可以尝试将每个条目读入内存流而不是文件系统:

ZipFile zip = ZipFile.Read(zipfile);
foreach(ZipEntry entry in zip.Entries)
{
    using(MemoryStream ms = new MemoryStream())
    {
        entry.Extract(ms);
        ms.Seek(0,SeekOrigin.Begin);
        // read from the stream
    }

}

【讨论】:

  • 非常感谢。这为我减少了 10 分钟的时间。
【解决方案2】:

也许不是将其提取到硬盘,您应该尝试使用OpenRead 不提取就读取它,然后您将不得不使用ZipArchiveEntry.Open 方法。

还可以查看CodeFluent Runtime 工具,该工具声称针对性能问题进行了改进。

【讨论】:

  • 但是使用 OpenRead 我可以读取压缩文件中的文件内容吗?假设我有一个 zip 文件 myzip.zip 并且里面有 my.txt。我可以在不提取文件的情况下读取 my.txt 中的数据吗?
【解决方案3】:

尝试将您的响应分解为单个等待异步方法,如果其中一个响应超过 50 毫秒,则这些方法会一一启动。 http://msdn.microsoft.com/en-us/library/hh191443.aspx

例如,如果我们有 10 个执行,它们一个接一个地调用,在 async/await 中,我们将执行称为并行,并且操作将仅取决于服务器的能力。

【讨论】:

  • 这根本不会加快速度。充其量它可能会使事情更具响应性,但 async/await 不可能减少总时间。
  • @BorHunter - 你的意思是并发,比如并行?
  • @StingyJack 是的,例如,如果我们有 10 个执行,它们一个接一个地调用,在 async/await 中,我们将我们的执行称为并行,并且操作将仅取决于服务器的能力。
  • 您可能需要更新您的答案以包含它。在任务不并发的情况下使用 async/await 是可能的,我认为这就是 George Mauer 所指出的。
猜你喜欢
  • 2019-01-13
  • 1970-01-01
  • 2018-05-04
  • 1970-01-01
  • 2015-01-07
  • 2023-04-07
  • 1970-01-01
  • 1970-01-01
  • 2020-06-01
相关资源
最近更新 更多