文件系统

时间:2016-12-16 08:27:05

标签: python tree filesystems full-text-search binary-search-tree

我在内存中存储/缓存文件系统(仅限文件名),以便能够快速研究àlaEverything 。因此,我不想使用操作系统的内置文件搜索GUI。

我这样做:

import os
L = []
for root,dirs,files in os.walk(PATH):
    L.append([root, files])

结果是这样的:

[['D:\\', ['a.jpg', 'b.jpg']], 
 ...
 ['D:\\Temp12', ['test.txt', 'test2.txt']]]

问题在于,当L包含数百万个元素时,进行研究需要花费太多时间:

query = 'test2' #searching for filename containg this text
for dir in L:
    for f in dir[1]:
        if query in f:
            print '%s found: %s' % (query, os.path.join(dir[0],f))

事实上,这是一个非常天真的搜索,因为它需要浏览整个列表才能找到项目。

如何更快地进行查询?

似乎列表不是进行全文研究的正确数据结构,是否存在树状结构?

2 个答案:

答案 0 :(得分:0)

列表中的研究是O(n),字典研究是摊销O(1)。如果您不需要关联值,请使用集合。

如果您想了解更多信息:https://www.ics.uci.edu/~pattis/ICS-33/lectures/complexitypython.txt

在你的情况下,我会使用集合。它会使您的查询更快。

编辑:

你这样做,检查每个文件的匹配不会那么快。即使您使用dict,也可以检查匹配的每个文件名。

新想法: 您可以创建一个dict,其中所有文件名都作为键,root作为每个的值。这样,您可以稍后重新创建完整路径。

现在的想法是创建一个树,每个节点都是一个字母,并且每个节点之间的路径都是单词(filename)。它可能很难实现,结果可能不会更快,具体取决于构造树的方式。

您必须记住,您要检查每个文件名并使用列表或词典不会改变它。树/图是我能想到的唯一解决方案。

答案 1 :(得分:0)

你能考虑为此使用数据库吗?

SQLite提供:memory:选项,它仅在内存中创建数据库。当然,您可以像其他答案和评论中所指出的那样优化您的算法和数据结构,但数据库通常已经非常擅长于它们的索引,并且您不需要设计类似的东西。

您的表可以只是一个包含字段full_path和filename的表,如果您按文件名对其进行索引,则表示速度很快。这会存储大量冗余信息,因为每个文件都有full_path中的完整路径。一个更好的解决方案是为目录创建一个表,为文件创建另一个表,并且您只需从文件中引用目录以获得匹配的完整路径。

只是一个想法。

哈努哈利

相关问题