【问题标题】:Overly Broad Directory.EnumerateFiles() vs Multiple File.Exists()?过于宽泛的 Directory.EnumerateFiles() 与多个 File.Exists()?
【发布时间】:2013-05-02 23:21:01
【问题描述】:

我正在更新一个程序,除其他外,它会检查给定路径中是​​否存在文件。这些文件可以位于主路径之外的许多子目录中的任何一个中。以前,我们在整个路径中搜索与给定模式匹配的文件,但部分更新是我们现在有一个单独的数组,其中包含我们期望拥有的文件列表。

鉴于该数组的存在,我正在考虑两种选择:

  1. Directory.EnumerateFiles(startingPath, pattern, SearchOption.Alldirectories) 使用相同的调用,然后对照我的数组检查结果(可能通过 lambda)。

  2. 对数组的每个成员多次调用File.Exists()

在一般情况下,对于任何给定的调用,我们在数组中讨论 3 个或更少的文件。在高端的情况下,我们仍然在谈论不到十几个。大多数执行将涉及成百上千次调用。

这个程序已经是一个资源消耗者,所以我肯定想在这里使用最有效的方法。哪个更有效率?有没有更好的办法?将文件名的数据结构从数组更改为另一种类型是可能的,如果这会带来改进的话。

【问题讨论】:

  • 两个都试一下,看看哪个更快,然后继续。这将在很大程度上取决于您的案例的具体情况,即目录树有多大,找到值的可能性,您正在搜索的项目的物理存储设备数量的规格等。为什么要猜测什么时候可以只需尝试使用您的实际数据和知道For further reading

标签: c# file-io io directory


【解决方案1】:

我会采用第二种方法,即对File.Exists 的大量调用,并以并行化的方式进行。 File.Exists 的吞吐量成本低但延迟成本高,因此为了速度,您希望它是异步的。

基本思路:

var fileExists = myFilePaths
    .AsParallel()
    .ToDictionary(path => path, path => File.Exists(path));

(当然,尝试第一种方法并进行速度比较是完全合理的——我只是给出了我的“最佳猜测”和第二种方法的 cmets。)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-05
    • 1970-01-01
    • 1970-01-01
    • 2011-07-03
    • 2021-09-10
    相关资源
    最近更新 更多