Python 在目录中存储文件查找表的高效设计

Python 在目录中存储文件查找表的高效设计,python,dictionary,lookup,file-search,Python,Dictionary,Lookup,File Search,假设我有三个目录,dir1,dir2&dir3,每个目录中有数千个文件。每个文件都有一个唯一的名称,没有模式 现在,给定一个文件名,我需要找到它所在的三个目录中的哪一个。我的第一个想法是创建一个字典,文件名作为键,目录作为值,如下所示: {'file1':'dir1', 'file2':'dir3', 'file3':'dir1', ... } 但鉴于只有三个唯一的值,这似乎有点多余,并占用了空间 有没有更好的方法来实现这一点?如果我可以在空间上妥协,但需要更快的查找,那该怎么办?解决这

假设我有三个目录,
dir1
dir2
&
dir3
,每个目录中有数千个文件。每个文件都有一个唯一的名称,没有模式

现在,给定一个文件名,我需要找到它所在的三个目录中的哪一个。我的第一个想法是创建一个字典,文件名作为键,目录作为值,如下所示:

{'file1':'dir1', 
 'file2':'dir3',
 'file3':'dir1', ... }
但鉴于只有三个唯一的值,这似乎有点多余,并占用了空间


有没有更好的方法来实现这一点?如果我可以在空间上妥协,但需要更快的查找,那该怎么办?

解决这个问题的一个简单方法是直接查询文件系统,而不是将所有文件名缓存在
dict
中。这将节省大量空间,如果只有几百个目录可供搜索,速度可能足够快

下面是一个简单的函数:

def find_directory(filename, directories):
    for directory in directories:
        path = os.path.join(directory, filename)
        if os.path.exists(path):
            return directory
在我的Linux系统上,当搜索大约170个目录时,第一次搜索大约需要0.3秒,之后只需要0.002秒。这是因为操作系统通过文件缓存来加速重复搜索。但是请注意,如果您使用
dict
在Python中进行这种缓存,您仍然需要支付类似的初始成本

当然,后续的
dict
查找要比直接查询文件系统快。但是你真的需要额外的速度吗?对我来说,千分之二秒在大多数情况下似乎很容易“足够快”。您还可以获得不需要刷新文件缓存的额外好处(因为操作系统会为您进行刷新)

附言:


我可能应该指出,上述时间安排是最糟糕的情况:也就是说,我先删除了所有系统文件缓存,然后搜索最后一个目录中的文件名。

您可以将索引存储为集合的dict。它可能更节省内存

index = {
    "dir1": {"f1", "f2", "f3", "f4"},
    "dir2": {"f3", "f4"},
    "dir3": {"f5", "f6", "f7"},
}

filename = "f4"
for dir, files in index.iteritems():
    if filename in files:
         print dir
说到数千个文件,您几乎看不到此方法与反向索引之间的任何区别


此外,可以使用python中的可重复字符串来节省内存。有时,CPython会实习短字符串本身。

您已经在空间上完成了。查找性能与使用字典所能达到的速度一样快。没有更快的查找速度。您是否进行过任何实际测试,证明性能将成为一个真正的问题?如果只有三个目录,为什么不使用文件系统来检查它们是否包含该文件?@ekhumaro我在本例中只使用了三个目录。在实践中,我有更多的方法。当然有很多方法可以更快地查找,但是否值得继续下去取决于您拥有的文件数量。例如,为了减少冲突时间,您可能希望根据文件名的前缀对索引进行分区。+即使您使用dict,FS缓存也会生成,这将大大降低内存效率,因此您最终将拥有一个缓存和一个无效(内存方面的)缓存(也称为dict),并且只使用其中一个。