从巨大的目录中有效地随机枚举文件

时间:2011-06-22 04:55:15

标签: c# fast-enumeration

我希望能够从目录中递归地枚举具有特定搜索模式(例如,* .txt)的文件。但有几个限制因素:

  1. 机制应该非常有效。目标是逐个枚举文件(使用IEnumerable),这样如果有一个庞大的文件列表,那么获取一个文件就不应该永远处理。
  2. 枚举应该随机返回文件,这样如果我的程序的两个实例试图枚举目录,则两者都不应该以相同的顺序看到文件。
  3. 鉴于要求,DirectoryInfo.EnumerateFiles看起来很有希望,但它不符合第二个要求。如果我删除性能考虑因素,解决方案很简单(只需获取整个集合并在访问之前随机化序列)。

    有人可以在.net 3.5 / 4.0中为C#实现建议可能的选择吗?

1 个答案:

答案 0 :(得分:1)

你所要求的是不可能的。

真正的“随机”枚举(在某种意义上,订单可能每次都会发生变化)需要“无需替换的选择”策略。这样的策略必然需要两个池:一个是“选择”文件,另一个是“未选择”。 “未选择”列表必须填充,然后才能随机“选择”它。这打破了你的#1要求。

关于如何解决问题的两个想法:

  1. 两个实例看到相同顺序的文件有什么问题?如果是文件锁定问题,请选择只读锁定。

  2. 你或许可以通过“持有桩”方法逃脱。在这里,您将创建自己的枚举器类,首先将少量FileInfo记录读入“Hold”集合。然后,每次你的调用代码请求一个文件时,它要么直接从EnumerateFiles中提取一个文件,要么从那里读取一个,但是将它与你的“Hold”堆中的一个交换出来然后返回那个。在EnumerateFiles不返回任何内容之前,该决定将是随机的,此时您将清空Hold堆。这不会提供真正的随机选择顺序,但也许它会为订单添加足够的模糊性以满足您的需求。 “Hold”系列的最大尺寸可以调整,以平衡您对“随机性”的需求与快速获取第一个文件的需求。

相关问题