【问题标题】:Data structure for filesystem文件系统的数据结构
【发布时间】:2016-12-16 08:27:05
【问题描述】:

我将文件系统(仅文件名)存储/缓存在内存中,以便能够进行快速研究à la Everything。因此我不想使用操作系统的内置文件搜索 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))

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

如何让查询更快?

也许列表似乎不是做全文研究的正确数据结构,有树状结构吗?

【问题讨论】:

  • 在 Python 中,我认为 dictionary 是您正在寻找的东西!
  • @Acepcs:即使我使用 dict {'D:\\': ['a.jpg', 'b.jpg'], ..., 'D:\\Temp12': ['test.txt', 'test2.txt']},我也必须遍历所有数以千计的键/值来进行搜索......你能准确地说出你的想法吗?
  • 我想到了一个完整的算法。当您浏览操作系统中的目录时,尝试制作一个文件名字典,每个键都是字母表中的一个字符,每个值都是以该字符开头的文件名列表,例如{'a':['a3.jpg','ab.jpg'],'b':['banana.gif','bad.jpg']},所以你通过构建前缀键可以节省大量迭代时间。如果你的数据量真的很大,你可以构建嵌套前缀字典,就像用 Python 实现的树(在一定程度上)
  • @Acepcs 好主意,它看起来像构建一个查找表/索引(就像在数据库中一样)。他们在 Python 或 Python 模块中的数据结构不是在内部执行此操作吗?
  • 对不起,不知道Python中是否有高级数据结构的模块或开源包。但我知道人们在 Python 中使用dictionarylist 实现树结构是很常见的。

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


【解决方案1】:

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

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

在你的情况下,我会使用集合。这将使您的查询速度更快。

编辑:

按照您的方式,检查每个文件是否匹配,这种方式再快不过了。即使您使用 dict,您也会检查每个文件名是否匹配。

新思路: 您可以创建一个字典,其中所有文件名作为键,根作为每个值。这样您以后可以重新创建完整路径。

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

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

【讨论】:

  • 如其他评论中所述,即使我使用字典{'D:\\': ['a.jpg', 'b.jpg'], ..., 'D:\\Temp12': ['test.txt', 'test2.txt']},我也必须遍历所有数千个键/值来进行搜索...您能否详细说明如何你会用dictset 来实现它吗?在我看来,必须对整个结构进行迭代才能进行搜索。
【解决方案2】:

您可以考虑为此使用数据库吗?

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

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

只是一个想法。

汉努

【讨论】:

    猜你喜欢
    • 2012-12-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-03
    • 2012-07-06
    • 2012-09-02
    相关资源
    最近更新 更多