
我的应用程序将索引最终用户计算机上所有硬盘的内容。 我正在使用Directory.Getfiles和Directory.GetDirectorIEsrecursion处理整个文件夹结构。 我只索引了几个选定的文件types(最多10个文件types)。
我在剖析器中看到,大部分索引时间都用于枚举文件和文件夹,这取决于实际上索引到90%的文件的比率。
我想尽可能快地做索引。 我已经优化了索引本身和处理索引文件。
我正在考虑使用Win32 API调用,但我实际上在剖析器中看到,大部分处理时间实际上都花在由.NET完成的这些API调用上。
对于windows窗体,PostMessage等于自己的什么?
在辅助显示器上全屏显示
windows Server / Datacenter:设置> 64核心的cpu亲和力
在C#中列出windowsnetworking连接/configuration文件
特定networking接口IPv4可用性 – 无连接,本地,Internet
是否有从C#访问(可能低级别)的方法,将文件/文件夹枚举至less部分更快?
根据评论的要求,我目前的代码(只是一个scheme,不相关的部分修剪):
private IEnumerable<IndexedEntity> RecurseFolder(string indexedFolder) { //for a single extension: string[] files = Directory.Getfiles(indexedFolder,extensionFilter); foreach (string file in files) { yIEld return Processfile(file); } foreach (string directory in Directory.GetDirectorIEs(indexedFolder)) { //recursively process all subdirectorIEs foreach (var IE in RecurseFolder(directory)) { yIEld return IE; } } }
X509Store位置与商店?
授予在没有UAC提示的情况下启动时启动的应用程序的pipe理员权限?
EndPoint:C#中的语法 – 这是什么?
windows CE 5.0 httpD < – > .NET应用程序
环境variables强制.NET应用程序运行为32位
在.NET 4.0中,有内置的枚举文件列表方法 ; 因为这不是很远,我会尝试使用。 如果您有大量文件夹(需要大量的数组分配),这可能是一个特别的因素。
如果深度是问题,我会考虑扁平您的方法使用本地堆栈/队列和一个迭代块。 这将减少用于枚举深层文件夹的代码路径:
private static IEnumerable<string> Walkfiles(string path,string filter) { var pending = new Queue<string>(); pending.Enqueue(path); string[] tmp; while (pending.Count > 0) { path = pending.Dequeue(); tmp = Directory.Getfiles(path,filter); for(int i = 0 ; i < tmp.Length ; i++) { yIEld return tmp[i]; } tmp = Directory.GetDirectorIEs(path); for (int i = 0; i < tmp.Length; i++) { pending.Enqueue(tmp[i]); } } }
迭代,从结果创建你的Processfile 。
如果您认为.NET实现导致问题,那么我建议您使用winAPI调用_findfirst,_findnext等。
在我看来,.NET需要大量的内存,因为列表被完全复制到目录的每个级别的数组中 – 所以如果你的目录结构是10层深的,那么在任何给定时刻你都有10个版本的数组文件,为该结构中的每个目录分配/取消分配此数组。
对_findfirst等使用相同的递归技术将只需要把目录结构中的一个位置的句柄保存在递归的每个级别。
总结以上是内存溢出为你收集整理的快速(低级)方法recursion处理文件夹中的文件全部内容,希望文章能够帮你解决快速(低级)方法recursion处理文件夹中的文件所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)