lmdb - LMDB的内部设计有什么特别之处?

标签 lmdb

内存中 B 树的某些 C++ 实现(例如谷歌 btree)和 LMDB(不考虑 LMDB 的所有功能,例如事务、隔离、共享访问等)之间的性能差异(读/写)是什么? .)?

最佳答案

其架构师 Howard Chu 的 2014 lmdb design presentation 涵盖了 lmdb 的设计和权衡。

总结一下:lmdb 是一个写时复制、自底向上更新、双缓冲、b 树,当它与其他考虑因素发生冲突时,实现总是倾向于简单。

智能设计选择 使其成为目前性能最高且抗损坏的 B 树实现之一。

  • 写时复制意味着数据永远不会被覆盖,避免了许多可能的损坏情况
  • 从叶子到根的自底向上更新使根更新等效于提交
  • 过去版本的双缓冲仅保留 db 文件中的最后两个根
  • 避免了复杂的多级缓存方案 - lmdb 依赖于底层操作系统进行缓存
  • 与其他 DB 相比,整个代码库非常小,避免 CPU 缓存未命中

  • 显然,这些选择意味着 lmdb 对复杂场景不友好,例如:
  • 多版本 DB 回滚(仅最后 2 个可用)
  • 长期事务和延迟提交:这些导致仅追加行为和数据库文件
  • 的潜在无限增长
  • 多个并发写入器:lmdb 支持更简单的多读取器和单写入器方案

  • 完整(超过 100 页)的演示文稿中还有更多内容。以上只是对 lmdb 精神的总结。
    lmdb 在著名的开源项目(如 Open LDAP 和 Memcached)中用作核心存储引擎,在这两种情况下,与替代方案相比,都观察到了数量级的加速,如 micro-benchmark results 所示。

    关于lmdb - LMDB的内部设计有什么特别之处?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35279756/

    相关文章:

    python - 如何在 lmdb 中正确插入重复键?

    c# - 在 C# 中等待 C++ 中的事件 - 作为任务或等待句柄

    python - 最大 LMDB 值大小

    deep-learning - 合并两个 LMDB 数据库以馈送到网络(caffe)

    database - lmdb(Symas Lightning 内存映射数据库)无法在​​ CentOS 上运行

    python - lmdb.BadRslotError : mdb_txn_begin: MDB_BAD_RSLOT: Invalid reuse of reader locktable slot?

    c++ - 如何强制 64 位 LMDB 生成 32 位数据库?

    lmdb:如何确定剩余的可用空间?