我正在研究实现简单的开源对象时态数据库的最佳数据结构,目前我非常喜欢使用持久性红黑树做它。在磁盘性能上的持久性(纯功能性)红黑树
我使用持久数据结构的主要原因首先是尽量减少锁的使用,因此数据库可以尽可能平行。另外,实现ACID事务更容易,甚至能够抽象出数据库在某种类的集群上并行工作。 这种方法的伟大之处在于它可以实现几乎免费的时间数据库。这是相当不错的,特别适用于网络和数据分析(例如趋势)。
所有这些都非常酷,但我对在磁盘上使用永久数据结构的整体性能有点怀疑。尽管现在有一些速度非常快的磁盘,并且所有写入都可以异步完成,所以响应总是立竿见影,我不想在一个错误的前提下构建所有应用程序,只是意识到它并不是一件好事方法来做到这一点。由于所有写操作都是异步完成的,并且使用持久数据结构将不会使前一个 - 当前有效的结构无效,所以写时间并不是真正的瓶颈。 - 关于像this这样的结构,有一些文档正好用于磁盘使用。但在我看来,这些技术将增加更多的读取开销以实现更快的写入。但我认为恰恰相反是可取的。同样,这些技术中的许多技术确实最终得到了多版本树,但它们并不是完全不可改变的,这对证明持续开销非常重要。 - 我知道在将值附加到数据库时仍然需要某种锁定,并且我也知道如果不是所有版本都要维护,应该有一个好的垃圾收集逻辑(否则文件大小肯定会大大增加)。也可以考虑三角洲压缩系统。 - 在所有搜索树结构中,我真的认为红黑最接近我所需要的,因为它们提供最少的旋转次数。
但是有一些可能的缺陷: - 异步写入 - 可以影响实时需要数据的应用程序。但大多数时候,我认为网络应用程序并不是这种情况。另外,当需要实时数据时,可以设计出另一种解决方案,例如需要以更实时的方式工作的特定数据的签入/签出系统。 - 也可能导致一些承诺冲突,尽管我没有想到它可能发生的一个很好的例子。如果两个线程使用相同的数据,那么在正常的RDBMS中也会发生提交冲突,对吗? - 像这样拥有一个不可变接口的开销将呈指数级增长,一切都注定很快就会失败,所以这一切都是一个坏主意。
有什么想法?
谢谢!
编辑: 似乎是一个持久数据结构是什么样的误解: http://en.wikipedia.org/wiki/Persistent_data_structure
你在杀我Smalls。 – 2010-05-05 02:10:25
你能解释为什么“我使用持久数据结构的主要原因首先是为了尽量减少锁的使用”???持续与否,你仍然需要锁... – 2010-05-05 04:12:42
嗯,你是对的。仍然需要使用锁,但将其最小化至最小。例如,就我的情况而言,我们需要锁定的唯一位置是“弱”引用,如红黑树的头部。将所有树更改附加到文件后,我们必须锁定它才能将指针(仅限于int)更改为树的头部。一个不知情的读者不可能在不一致的状态下捕捉该树,并且该锁应该工作得非常快。 此外,为了写入,唯一需要锁定的时间是更改文件的大小(将数据附加到它) – Waneck 2010-05-05 12:21:33