我们说我有三个目录Nathen
Jamie
Tom
Lavi
,dir1
& dir2
,每个文件包含数千个文件。每个文件都有一个没有模式的唯一名称。
现在,给定一个文件名,我需要找到它所在的三个目录中的哪一个。我的第一个想法是创建一个字典,其文件名为key,目录为值,如下所示:
dir3
但是看到只有三个独特的值,这似乎有点多余,占用空间。
有没有更好的方法来实现这个?如果我可以在空间上妥协但需要更快的查找怎么办?
答案 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实习生会短信串。