【发布时间】:2009-11-23 16:40:00
【问题描述】:
我们有一个相当大的磁盘阵列,上面大约有 2-3 百万个 XML 文件。磁盘使用 NTFS 格式化,我们想使用通配符搜索文件系统。所以像 * SomePartOfTheFilename * 这样的东西是一个典型的搜索查询。
我们正在使用 .Net,发现使用 DirectoryInfo 似乎很慢。
DirectoryInfo directoryInfo = new DirectoryInfo(directory);
List<FileInfo> fileInfos = directoryInfo.GetFiles(searchString, SearchOption.AllDirectories).ToList();
使用循环和递归也很慢。
我们可以使用较低级别的 API 调用来直接搜索 NTFS 索引吗?
从命令行使用 dir * SomePartOfTheFilename * /s 几乎是即时的。有什么可以利用的吗?
【问题讨论】:
-
cygwin 中的 find 是否也能很快完成,还是与您的 .net 代码速度相似?如果是这样,它可能是 cmd.exe 和预建索引之间的一些超级秘密 MS 集成。
-
是否有任何特殊原因您没有使用索引服务(如下所述)或一些自制解决方案构建外部索引?搜索文件系统不仅对您来说很慢,而且如果磁盘磁头最终在试图为竞争请求提供服务时挣扎,您可能会减慢其他人正在做的工作......
-
我们希望 NTFS 索引足够快,我们可能会为文件创建自己的索引,但想先探索其他选项。
-
我已经开始简单地创建一个文本文件(想想:dir /s /b C:\ > filelist.txt)作为索引。我发现 Windows(在 win7 上)文件索引非常慢并且通常不可靠。 Windows 索引经常找不到我知道的文件,我不得不强制重建来解决问题。搜索文本文件既快速又可靠,但并不理想。