索引文件和在文件夹中查找文件的最快方法?

Sta*_*Cub 5 c# xml directory file

我在 22 个文件夹中有 660000 个 xml 文件(具有唯一的文件名)。每个文件夹有 30000 个文件。我需要在 C# 应用程序中有效地按名称找到它们。我知道 Windows(?Vista+?) 中有一个 SearchIndexer 服务,我只是想知道我是否可以使用它,或者我必须自己索引文件?

或者,我想我可以创建一个数据库,文件名是另一列中的主键和路径。但是,我应该创建一个包含 660000 行的表还是 22 个包含 30000 行的表?为什么?

提前致谢。

Rob*_*Rob 3

我在这方面的经验可能已经过时了(NTFS),但是您应该检查在包含 30,000 个文件的目录中打开一个文件的速度有多快。我想您可能会发现最好将文件分布在更多目录中。

如果您可以控制目录布局,请考虑将文件名散列为 0 到 660000 之间的数字。然后您可以使用文件系统作为索引:

00/
  00/
    <99 files that hash here>
..
65
Run Code Online (Sandbox Code Playgroud)

您仍然需要编写一个简单的“索引器”来读取每个文件,计算其哈希并将其存储在正确的位置。然后您可以按以下方式查找文件:

Lookup(string filename)
{
   int hash = filename.GetHashCode() % 660000;
   string directory = HashToDirectory(hash);
   string path = Path.Combine(directory, filename);
   ...
Run Code Online (Sandbox Code Playgroud)

这种方法的好处之一是您可以分析目录中文件数量的各种“密度”。你只要改变一下HashToPath功能就可以了。您也不需要数据库。

我们对存储大量文件的网络爬虫使用了类似的方法。它是针对 NTFS 的,所以 YMMV。