如何减少提取文件所需的时间?

Posted

技术标签:

【中文标题】如何减少提取文件所需的时间?【英文标题】: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 【参考方案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 所指出的。

以上是关于如何减少提取文件所需的时间?的主要内容,如果未能解决你的问题,请参考以下文章

如何减少显示输出所需的加载时间?

如何从图像中提取所需的文本部分,而不是使用 OCR 提取图像中的所有文本?

如果我们在不增加文件数量的情况下增加存储在 HDFS 中的文件大小,NameNode 所需的内存是增加还是减少?

仅从网站中提取所需的列

每组所需的最大行数

如何解析URL并提取所需的子字符串