【发布时间】:2011-02-15 17:53:27
【问题描述】:
我正在研究最好的数据结构来实现一个简单的开源对象时态数据库,目前我非常喜欢使用 Persistent Red-Black 树来完成它。
我使用持久化数据结构的主要原因首先是尽量减少锁的使用,这样数据库可以尽可能的并行。此外,实现 ACID 事务将更容易,甚至能够将数据库抽象为在某种集群上并行工作。 这种方法的伟大之处在于它几乎可以免费实现时态数据库。这是非常好的东西,特别是对于网络和数据分析(例如趋势)。
所有这些都非常酷,但我对在磁盘上使用持久数据结构的整体性能有点怀疑。尽管现在有一些非常快的磁盘可用,并且所有的写入都可以异步完成,所以响应总是立即的,我不想在一个错误的前提下构建所有应用程序,只是意识到这并不是一个好的方法。
这是我的想法: - 由于所有写入都是异步完成的,并且使用持久数据结构不会使以前的 - 和当前有效的 - 结构无效,因此写入时间并不是真正的瓶颈。 - 有一些关于像this 这样的结构的文献,这些结构完全适合磁盘使用。但在我看来,这些技术会增加更多的读取开销以实现更快的写入。但我认为恰恰相反更可取。此外,许多这些技术确实最终会产生多版本树,但它们并不是严格不可变的,这对于证明持久开销的合理性非常重要。 - 我知道在将值附加到数据库时仍然需要某种锁定,并且我也知道如果不是要维护所有版本,应该有一个很好的垃圾收集逻辑(否则文件大小肯定会急剧增加) .也可以考虑使用增量压缩系统。 - 在所有搜索树结构中,我真的认为红黑是最接近我需要的,因为它们提供的旋转次数最少。
但在此过程中可能存在一些陷阱: - 异步写入 - 可能会影响需要实时数据的应用程序。但我认为大多数时候 Web 应用程序并非如此。此外,当需要实时数据时,可以设计另一种解决方案,例如需要以更实时的方式处理特定数据的签入/签出系统。 - 它们也可能导致一些提交冲突,尽管我想不出一个很好的例子来说明何时会发生。如果两个线程处理相同的数据,在正常的 RDBMS 中也会发生提交冲突,对吗? - 拥有这样一个不可变接口的开销将呈指数级增长,一切都注定很快就会失败,所以这一切都是个坏主意。
有什么想法吗?
谢谢!
编辑: 似乎对什么是持久数据结构存在误解: http://en.wikipedia.org/wiki/Persistent_data_structure
【问题讨论】:
-
你能解释一下为什么“我使用持久数据结构的主要原因首先是尽量减少锁的使用”吗?持久与否,你仍然需要锁......
-
嗯,你是对的。仍然需要使用锁,但它已降至最低限度。例如,在我的例子中,我们唯一需要锁的地方是“弱”引用,比如红黑树的头部。将所有树更改附加到文件后,我们必须锁定它,仅将指针(仅一个 int)更改为树的头部。不知道的读者不可能捕获处于不一致状态的树,并且锁应该非常快地工作。同样对于写入,唯一需要锁定的时间是更改文件的大小(向其追加数据)
-
我刚刚意识到像 Okasaki 的书中建议的那种纯函数式方法并不是一个好的选择,因为不仅空间效率很差,而且更难查询一段时间,因为需要检查从一个版本到另一个版本的变化。
-
也许保留提交日志,比如 git,可以解决这个问题
-
您可能想查看this(一个功能性的、仅限附加的数据库)
标签: database data-structures functional-programming binary-tree immutability