如何减少提取文件所需的时间?
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
可以是Open
ed
如果我使用 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 提取图像中的所有文本?