LMDB 是否支持随机读取?

Does LMDB support random reads?

本文关键字:读取 随机 支持 是否 LMDB      更新时间:2023-10-16

假设有一个大的 LMDB 文件,通常,我会使用 mdb_cursor_get(光标、&键、&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