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

Filesystems 持久性:数据树存储为目录树,filesystems,persistence,tree-structure,Filesystems,Persistence,Tree Structure,我想知道为持久化目的将内存中的树结构存储为目录树的实用性。在我的例子中,目标文件系统将是ZFS,一旦创建了结构,多个进程将很少访问它 使用目录树作为数据树的持久性机制的性能如何?如果我理解正确,您所说的是构建一个树结构,它将提供文件系统的代码内表示,因此我怀疑您在开始读取树结构时会产生开销,但随后对树的查找和遍历可能比每次访问磁盘存储要快。为了读取和写入树,您将在每个节点上多次调用文件系统。这比你能设计出的任何正常代码都要昂贵得多 它是否合理取决于您的使用模式。如果在一个典型的代码调用中,您希望

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


使用目录树作为数据树的持久性机制的性能如何?如果我理解正确,您所说的是构建一个树结构,它将提供文件系统的代码内表示,因此我怀疑您在开始读取树结构时会产生开销,但随后对树的查找和遍历可能比每次访问磁盘存储要快。

为了读取和写入树,您将在每个节点上多次调用文件系统。这比你能设计出的任何正常代码都要昂贵得多

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

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


编辑:我为一个站点的CGI后端使用ext3做了类似的事情;不是重新发明轮子使原型制作更快,维护更简单,读/写/锁定扩展得相当好,但目录结构本身的频繁更改(每秒数百次)在实际存储中效果不佳;最后,我重组了一些东西,以便目录树中经常添加/删除目录项的部分最终位于tmpfs卷上——对我来说,这组状态可以(昂贵地)在重新启动后从存储在不太易失性的存储中的状态重建。我对ZFS没有什么经验,也不知道您的预期使用模式,所以不知道这是否会给您带来问题。如果我现在为一个使用率非常高的站点执行此操作,我可能会使用自己的命名锁库来代替。

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

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

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

可能的问题:

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

一句话:这可能不值得。

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