LMDB 是否支持随机读取?

Does LMDB support random reads?

假设有一个很大的 LMDB 文件,通常,我会通过游标使用 mdb_cursor_get(cursor, &key, &data, MDB_NEXT) 顺序获取它的内容。

现在,为了提高读取速度,我创建了一个队列,将LMDB分成10等份,启动10个线程分别读取每块内容,然后将每个线程读取的内容放入队列中。

可以吗?我不在乎顺序只在乎内容。

如果是,如何在每个线程上同步游标?

在我的测试中,多线程并没有提高读取LMDB的效率,反而增加了一倍(或更多)的读取时间。

测试方法:

  1. 生成10000条数据的LMDB,记录完整读取时间:365s

  2. 将这10000条数据的LMDB分成两等分和四等分,独立读取一等分: 只读一篇5000_LMDB 时间:170s 只读一个2500_LMDB次:81s

  3. 启动多线程读取LMDB: 两个线程,读取两个 5000_LMDB 的总时间:596x2s 四个线程,读取四个的总时间 2500_LMDB : 301x4s