LMDB 是否支持随机读取?
Does LMDB support random reads?
假设有一个大的 LMDB 文件,通常,我会使用 mdb_cursor_get(光标、&键、&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 是否支持随机读取?
- 读取大文件(>2GB)(文本文件包含以太网数据)并通过不同参数随机访问数据的最佳方法是什么?
- C++读取大文件并将其保存到字符串中,然后删除特定的随机单词
- 尝试以随机字符(长读取)打印字符串返回结果
- 多次随机向量后的读取访问冲突
- 随机读取使用MapViewOffile的文件
- 如何在c++中从txt文件的随机位置读取数据
- 如何从键盘读取完整的随机文本,过滤和投射
- 读取文本文件并随机播放
- 从文件中读取随机字符串时出错
- 将C 对象读取到随机访问文件中
- 从控制台C++读取随机整数的更快方法
- C++:从文本文件中读取随机行
- 从 c++ 通过 activex 读取 Outlook 通讯簿会随机返回未知错误
- 从管道读取随机失败
- 使用 ifstream 读取列中随机生成的数字的文本文件,并从列表中查找最小值和最大值
- C++以二进制流的形式读取文件,在中间随机跳过字节
- 从txt文件中读取一个随机行,然后在QT SDK中对其进行修剪
- C++fread读取文件开头的随机字符
- 如果要读取随机森林(opencv3.0)的xml文件,则标签类型必须为float