NTFS文件目录搜索性能

本文关键字:性能 搜索 文件目录 NTFS | 更新日期: 2023-09-27 18:09:53

我想写一个缓存文件夹来存储计算过的数据,这样我就不必每次都重新计算,因为输入的数据是相同的。因此,我计算输入数据的哈希值(例如,对输入文件进行哈希),将其转换为允许的字符字符串,并希望将其用作公共缓存目录中的文件名,因此我可以使用哈希值快速找到计算的数据。缓存文件的数量不会特别大(<10000),所以我认为使用单个文件夹应该不是问题。

正如经常出现的问题一样,高级用户可能希望以更智能的方式删除不再需要的缓存数据,而不是删除整个缓存。所以我认为这将是一个很好的选择,在文件名中包含额外的人类可读信息(例如输入文件的原始文件名)。缓存文件名将具有以下结构:

<hash>_<info>.<extension>

,其中_<hash>中禁止的任何分隔字符。当然,我将关心,只有一个文件具有相同的哈希值,就像第一个缓存文件获胜,并防止创建一个新的。

我现在的问题是,这是否会影响用请求的散列搜索文件的性能?没有额外的信息,我有一个固定的文件名,我只是搜索。但是随着信息的添加,我需要搜索一个以请求的散列开头的文件,例如使用通配符,如<hash>_*.<extension>

据我所知,NTFS使用B+树来组织目录内的文件名。因此,无论我搜索的是固定文件名还是带有通配符的文件名,它都会遍历树。所以我想重要的部分应该放在文件名的开头,不重要的部分放在文件名的末尾。但是使用通配符搜索是否会影响性能呢?如果有可能解决这个问题吗?

如果重要的话,我用c#写,使用Directory.EnumerateFiles()之类的东西,但我愿意接受其他建议。

NTFS文件目录搜索性能

NTFS可以足够智能地对非元字符文本(如"hash_*.ext")进行前缀查找。所以你可以>find<但是打开文件就意味着重新遍历。>

此外,添加额外的信息减少了每个b树页面中的条目密度,这意味着在查找文件时可能需要搜索更多的页面。

我将保持名称尽可能短,以满足您的开放性能需求,并将人类可读的信息粘贴到备用数据流中。当执行"dir"时,你不会看到这个信息,但它可以任意大。