LMDB 是否支持随机读取?
Does LMDB support random reads?
假设有一个很大的 LMDB 文件,通常,我会通过游标使用 mdb_cursor_get(cursor, &key, &data, MDB_NEXT) 顺序获取它的内容。
现在,为了提高读取速度,我创建了一个队列,将LMDB分成10等份,启动10个线程分别读取每块内容,然后将每个线程读取的内容放入队列中。
可以吗?我不在乎顺序只在乎内容。
如果是,如何在每个线程上同步游标?
在我的测试中,多线程并没有提高读取LMDB的效率,反而增加了一倍(或更多)的读取时间。
测试方法:
生成10000条数据的LMDB,记录完整读取时间:365s
将这10000条数据的LMDB分成两等分和四等分,独立读取一等分:
只读一篇5000_LMDB 时间:170s
只读一个2500_LMDB次:81s
启动多线程读取LMDB:
两个线程,读取两个 5000_LMDB 的总时间:596x2s
四个线程,读取四个的总时间 2500_LMDB : 301x4s
假设有一个很大的 LMDB 文件,通常,我会通过游标使用 mdb_cursor_get(cursor, &key, &data, MDB_NEXT) 顺序获取它的内容。
现在,为了提高读取速度,我创建了一个队列,将LMDB分成10等份,启动10个线程分别读取每块内容,然后将每个线程读取的内容放入队列中。
可以吗?我不在乎顺序只在乎内容。
如果是,如何在每个线程上同步游标?
在我的测试中,多线程并没有提高读取LMDB的效率,反而增加了一倍(或更多)的读取时间。
测试方法:
生成10000条数据的LMDB,记录完整读取时间:365s
将这10000条数据的LMDB分成两等分和四等分,独立读取一等分: 只读一篇5000_LMDB 时间:170s 只读一个2500_LMDB次:81s
启动多线程读取LMDB: 两个线程,读取两个 5000_LMDB 的总时间:596x2s 四个线程,读取四个的总时间 2500_LMDB : 301x4s