database - 使用 LMDB 在内存数据库中

标签 database berkeley-db lmdb

我有一个项目使用 BerkelyDB 作为键值存储,可存储多达数亿条小记录。

它的使用方式是将所有值插入数据库,然后使用顺序访问和随机访问对它们进行迭代,所有这些都来自单个线程。

使用 BerkeleyDB,我可以创建 in-memory databases “从不打算保存在磁盘上”。如果数据库小到可以放入 BerkeleyDB 缓存,它永远不会被写入磁盘。如果它比缓存大,那么将创建一个临时文件来保存溢出。此选项可以显着加快速度,因为它可以防止我的应用程序在关闭数据库时将数 GB 的无效数据写入磁盘。

我发现 BerkeleyDB 的写入性能太差,即使在 SSD 上也是如此,所以我想切换到 LMDB .但是,基于 documentation,似乎没有创建非持久性数据库的选项。

如果我根本不关心持久性或并发访问,我应该使用什么配置/选项组合来获得 LMDB 的最佳性能?即让它像一个带有临时支持磁盘存储的“内存数据库”?

最佳答案

只需使用 MDB_NOSYNC,永远不要调用 mdb_env_sync()你自己。此外,您还可以使用 MDB_WRITEMAP。操作系统最终仍会将脏页刷新到磁盘;您可以使用/proc/sys/vm/dirty_ratio 等来控制该行为。

关于database - 使用 LMDB 在内存数据库中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36170778/

相关文章:

python - 哈希表解释

MongoDB排序只存在条目,有值的键在前,空或不存在的键在最后

machine-learning - 检查失败 : mdb_status == 0 (2 vs. 0) 没有这样的文件或目录

python - 在 Caffe 中生成用于对象检测的 lmdb 文件

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

java - 将 Derby 数据库导出为 sql 文件

database - 在数据库列中存储分隔列表真的那么糟糕吗?

c - Berkeley DB 存储速度太慢

mysql - 数据库连接MySQL或Berkeley DB

c - 如何让 DBCursor->get(...) 识别我为 key.data 和 data.data 分配的内存