如何缩短从大量目录中采集文件路径的耗时?
优化方案:减少文件夹文件枚举的IO耗时
核心问题分析
当前代码用Directory.GetFiles(Folder)会一次性读取目标文件夹的所有文件路径并生成数组,即便你只需要前100条。对平均500个文件的1500个文件夹来说,这意味着额外读取了(500-100)*1500=600,000条无用路径,大量冗余IO操作是耗时的主要原因。
具体优化措施
1. 用延迟加载枚举替代全量读取
Directory.EnumerateFiles()是延迟枚举模式,不会一次性加载所有文件路径到内存,而是按需返回单个路径。配合Take(100)可直接获取前100条,避免读取多余文件:
foreach (string Folder in FolderList) { // 只枚举前100个文件路径,直接添加到目标列表 foreach (string filePath in Directory.EnumerateFiles(Folder).Take(100)) { FileList.Add(filePath); } }
2. 并行遍历提升效率(可选)
如果系统有多余CPU核心,可并行处理文件夹枚举,利用多核加速IO操作(注意线程安全):
// 用线程安全集合存储结果,避免并发Add冲突 var concurrentFileList = new ConcurrentBag<string>(); Parallel.ForEach(FolderList, folder => { foreach (string filePath in Directory.EnumerateFiles(folder).Take(100)) { concurrentFileList.Add(filePath); } }); // 转成普通List(如果需要) FileList = concurrentFileList.ToList();
3. 额外细节优化
- 去掉临时列表
FileListTMP,直接将枚举结果添加到目标列表,减少内存分配和拷贝开销; EnumerateFiles默认顺序已满足需求,无需额外排序;- 机械硬盘上,尽量让FolderList的顺序与文件夹物理存储顺序一致,减少磁头寻道时间。
效果预估
使用EnumerateFiles+Take(100)后,每个文件夹的IO操作减少约80%,理论上能将耗时压缩到原来的20%-30%,无需更换SSD即可显著提速。
内容的提问来源于stack exchange,提问作者xardius159
相关产品推荐
相关产品推荐

