【问题标题】:Store and search directory tree in memory efficiently高效地在内存中存储和搜索目录树
【发布时间】:2010-12-01 09:11:44
【问题描述】:

我想尽可能高效地将所有目录存储在一个巨大的驱动器上的内存中,并且还能够在给定完整路径的情况下检索一个目录。每个目录都有它的名称字段(不是完整路径)和一个指向它的父目录的指针和一个子目录列表。你觉得应该走哪条路?

在我看来,有几种方法:

a) 将每个目录的完整路径存储在字典中并进行简单查找。优点:速度快,缺点:每个完整路径字符串都占用了不必要和冗余的内存量

b) 仅将实际目录名称存储在字典中,其中包含具有该名称的所有目录的列表,然后检查匹配是否正确:优点:非常快,缺点:必须为每个目录存储一个列表或使用将列表或目录存储在字典中。

c) 跳过字典,从根开始遍历树并通过拆分路径找到匹配项。也许使用 PLINQ 来加快速度。优点:字典没有内存开销,缺点:可能比查找慢。

d) 其他一些我没想到的方式...

【问题讨论】:

  • 你在优化速度/内存吗?
  • 但是你为什么要这样做呢?是作业吗,如果是请适当标记。
  • 比记忆更快,但最好不要过度记忆
  • 您需要在线更新吗?您需要目录浏览,还是只是查找?
  • 结构可能需要偶尔重建/更新/替换,但如果这意味着它可以在浏览和查找方面进行优化,它在内存中可能是相当静态的

标签: c# data-structures


【解决方案1】:

如果您可以将子目录存储为字典而不是列表(对于需要所有子目录的情况,可以使用 Values 属性轻松完成),那么您可以单步执行路径,每个步骤都为 O (1) 因此从完整路径中查找目录的复杂度为 O(n),其中 n 是路径中的步骤数,与系统中的目录数无关。

【讨论】:

  • 我刚刚意识到,如果我拆分路径并从不需要搜索每个目录的根目录开始,则需要简单的树遍历。如果你想用性能来抵消内存,将子目录放入字典是一个很好的改进。
  • 如果想优化内存,也许可以使用排序列表和二进制搜索
  • 是的,这使得它 O(n log m) 其中 n 是路径步骤数,m 是每个目录中的子目录数(显然每一步都会改变,但它给了你一个衡量标准平均案例行为)。
  • 对于树遍历,可能有交汇点/(硬)链接/符号链接/挂载点,您必须检查并排除它们
【解决方案2】:

使用数据库。观点。如果树不是很小,问题是有效的搜索。它需要一个索引。

跳过字典,做一个 遍历整个的枚举器 树并找到匹配项

不是“高效”,但最糟糕的解决方案时间明智,不是完全浪费编程明智,而且让事情变得比不费吹灰之力更慢。

问题在于,与在 temp 目录中使用 SqlLite 之类的东西相比,高效的部分查找需要一个索引,该索引需要大量的编程来维护。

【讨论】:

    猜你喜欢
    • 2011-12-03
    • 2018-08-07
    • 1970-01-01
    • 1970-01-01
    • 2014-03-12
    • 2012-05-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多