持久性:数据树存储为目录树

时间:2008-10-08 16:47:49

标签: filesystems persistence tree-structure

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

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

4 个答案:

答案 0 :(得分:3)

为了读取和写入树,您将在每个节点上多次调用文件系统。这比你设计用于记忆图像的任何理智代码要贵得多。

这是否合理,取决于您的使用模式。如果在典型的代码调用中,您希望在整个树结构中进行读取,对其进行处理,然后将其全部写出来 - 最好将其编组为单个文件。但是,如果您希望只读取/处理/变异几个节点,在大多数树中没有读取,则在遍历目录结构和执行多个搜索/读取之间的性能差异存储在单个文件中的树将小得多,并且为了简单/清晰/避免重新发明轮子,可能值得做前者。此外,如果多个进程同时执行此操作,则使用基于目录的方法可以更轻松地锁定节点和子树。

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

编辑:对于网站的CGI后端,我用ext3做了类似的事情;不重新发明轮子使原型制作更快,维护更简单,读/写/锁定相当好,非常频繁的更改 - 大约每秒数百个 - 到目录结构本身在实际存储上运行不佳;最后我重组了一些内容,以便目录条目中经常添加/删除目录条目的部分最终会出现在tmpfs卷上 - 对我来说,这组状态可以(昂贵地)从存储在不易变化的存储中的状态重建重启后。我对ZFS没什么经验,也不知道你想要的使用模式,所以不知道这对你来说是否有问题。如果我现在为一个使用频率很高的网站做这个,我可能会改为使用我自己的命名锁库。

答案 1 :(得分:2)

大多数文件系统都经过优化,可以访问打开的文件,因此打开/关闭文件需要很长时间。如果树的每片叶子都很小,那么读/写整个结构所需的时间会比需要的时间长很多。

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

简而言之,你的叶子越小,想法越差。

答案 2 :(得分:1)

如果我理解正确你正在讨论构建一个树形结构,它会给出你的文件系统的代码内表示,所以我怀疑你在开始阅读树形结构时会产生开销,但随后的树的查找和遍历可能比每次访问磁盘存储更快。

答案 3 :(得分:1)

可能的问题:

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

底线:可能不值得。