【问题标题】:Persistence: Data Trees stored as Directory Trees持久性:存储为目录树的数据树
【发布时间】:2008-10-08 16:47:49
【问题描述】:

我想知道将内存树结构存储为目录树以实现持久性的实用性。在我的例子中,他的目标文件系统将是 ZFS,一旦创建了结构,它将不经常被多个进程访问。

使用目录树作为数据树的持久性机制的性能如何?

【问题讨论】:

    标签: filesystems persistence tree-structure


    【解决方案1】:

    为了读取和写入您的树,您将在每个节点多次调用文件系统。这比你可以设计出的任何健全的代码来遍历记忆图像要昂贵得多。

    这是否是一种明智的方法取决于您预期的使用模式。如果在典型的代码调用中,您希望读取整个树结构,则对其进行处理,然后将其完整地写出来——最好将其编组到一个文件中。但是,如果您希望只读取/处理/改变几个节点,而不读取大部分树,那么遍历目录结构和执行多次查找/读取以遍历之间的性能差异存储在单个文件中的树会小得多,为了简单/清晰/避免重新发明轮子,这样做很值得做前者。此外,如果多个进程同时执行此操作,则使用基于目录的方法锁定节点和子树会变得更加容易。

    请注意,对于一些常用的文件系统,打开目录条目的时间取决于目录中的条目总数。

    编辑:我用 ext3 为网站的 CG​​I 后端做了类似的事情;不重新发明轮子使原型设计更快,维护更简单,读/写/锁定扩展得很好,但是非常频繁的更改 - 每秒数百次 - 目录结构本身在实际存储中效果不佳;最后,我重组了一些东西,以便经常添加/删除目录条目的目录树部分最终在 tmpfs 卷上结束 - 对我来说,这组状态可以(昂贵地)从存储在较少易失性存储中的状态中重建重启后。我对 ZFS 的经验很少,也不知道您的预期使用模式,所以不知道这对您来说是否有问题。如果我现在为一个使用量非常大的网站执行此操作,我可能会转而使用我自己的命名锁库。

    【讨论】:

    • @moonshadow:感谢您的编辑。我认为我在任何地方都不需要你所描述的限制!所以我想我会在可预见的未来使用这个模型。谢谢。 :)
    【解决方案2】:

    大多数文件系统都针对访问打开的文件进行了优化,因此打开/关闭文件需要很长时间。如果树的每一片叶子都很小,那么读取/写入整个结构所需的时间将比所需时间长很多倍。

    此外,大多数文件系统都有一个最小的分配块,通常约为 2-8KB。如果你的叶子比这小得多,你会浪费很多空间。

    简而言之,你的叶子越小,想法就越糟糕。

    【讨论】:

      【解决方案3】:

      如果我理解正确,您所说的是构建一个树结构,该结构将提供文件系统的代码内表示,所以我怀疑您在开始读取树结构时会产生开销,但随后对树的查找和遍历可能比每次都访问磁盘存储要快。

      【讨论】:

        【解决方案4】:

        可能的问题:

        • 它可能对磁盘空间的使用效率低下(在许多文件系统中,目录就是一个文件,因此占用了磁盘上的整个块...)
        • 读取/写入会很慢,因为您进行了许多文件系统访问
        • 文件系统可能/将限制每个项目名称的长度和/或可用于名称的字符
        • 其他进程很容易损坏您的数据和/或需要相当大的锁定成本
        • 当使用固态“磁盘”时,这可能会导致比其他方法更多的写入并缩短介质的寿命

        底线:可能不值得。

        【讨论】:

          猜你喜欢
          • 2015-03-12
          • 1970-01-01
          • 2011-07-22
          • 2016-12-03
          • 2019-03-19
          • 2015-08-20
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多