高效设计,用于存储目录中文件的查找表

时间:2017-11-01 22:39:00

标签: python dictionary lookup file-search

我们说我有三个目录Nathen Jamie Tom Lavidir1& dir2,每个文件包含数千个文件。每个文件都有一个没有模式的唯一名称。

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

dir3

但是看到只有三个独特的值,这似乎有点多余,占用空间。

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

2 个答案:

答案 0 :(得分:1)

解决此问题的一种简单方法是直接查询文件系统,而不是缓存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查找比直接查询文件系统要快。但你真的需要额外的速度吗?对我来说,千分之二秒似乎很容易“足够快”用于大多数目的。并且您可以获得永远不需要刷新文件缓存的额外好处(因为操作系统会为您执行此操作)。

PS:

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

答案 1 :(得分:1)

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

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中的可重复字符串可以是interned以节省内存。有时CPython实习生会短信串。