You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何缩短从大量目录中采集文件路径的耗时?

优化方案:减少文件夹文件枚举的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.15 18:32:47