我有一个项目,它使用BerkelyDB作为关键值存储,可存储数亿个小记录。
它的使用方式是将所有值插入到数据库中,然后使用顺序和随机访问对它们进行迭代,所有这些都来自单个线程。
使用BerkeleyDB,我可以创建{&3;}永远不打算保留在磁盘上的in-memory databases"。如果数据库足够小以适应BerkeleyDB缓存,则永远不会将其写入磁盘。如果它大于缓存,则将创建一个临时文件来保存溢出。此选项可以显着加快速度,因为它可以阻止我的应用程序在关闭数据库时将数十亿字节的死数据写入磁盘。
我发现BerkeleyDB写入性能太差,即使在SSD上也是如此,所以我想切换到LMDB。但是,根据documentation,,似乎没有创建非持久性数据库的选项。
如果我不关心持久性或并发访问,我应该使用哪些配置/组合选项来获得LMDB的最佳性能?即使它像一个内存数据库"临时支持磁盘存储?
答案 0 :(得分:2)
只需使用MDB_NOSYNC,就不要自己调用mdb_env_sync()。您还可以使用MDB_WRITEMAP。操作系统最终仍会将脏页刷新到磁盘;你可以使用/ proc / sys / vm / dirty_ratio等来控制这种行为。
答案 1 :(得分:0)
从这篇文章:https://lonesysadmin.net/2013/12/22/better-linux-disk-caching-performance-vm-dirty_ratio/
vm.dirty_ratio是在必须将所有内容提交到磁盘之前可以用脏页填充的绝对最大系统内存量。当系统到达此点时,所有新的I / O 阻止,直到脏页被写入磁盘。
如果脏比率太小,那么您将看到频繁的同步磁盘写入。