lmdb使用小结
使用lmdb
可以加速数据从磁盘读取的速度,查看了很多资料,记录一下
简介
lmdb全称为Lightning Memory-Mapped Database
,其拥有如下特性:
- Ordered map interface (keys are always lexicographically sorted).
- Reader/writer transactions: readers don’t block writers, writers don’t block readers. Each environment supports one concurrent write transaction.
- Read transactions are extremely cheap.
- Environments may be opened by multiple processes on the same host, making it ideal for working around Python’s GIL.
- Multiple named databases may be created with transactions covering all named databases.
- Memory mapped, allowing for zero copy lookup and iteration. This is optionally exposed to Python using the buffer() interface.
- Maintenance requires no external process or background threads.
- No application-level caching is required: LMDB fully exploits the operating system’s buffer cache.
- 有序映射接口(键总是按字典顺序排序);
- 读写器事务:读取器不阻止写入器,写入器不阻止读取器。每个环境支持一个并发写事务;
- 读事务非常简单快速;
- 环境对象可以由同一主机上的多个进程打开,非常适用于Python的GIL开发环境;
- 事务可以创建多个命名数据库;
- 内存映射,允许零拷贝查找和迭代。可以选择使用buffer()接口进行优化,这是Python可选的;
- 维护不需要外部进程或后台线程;
- 不需要应用程序级缓存:LMDB完全利用操作系统的缓冲区缓存。
基本操作
- 创建环境对象
- 创建事务对象(读取器或者写入器)
- 进行读取或者写入操作
- 关闭事务对象
- 关闭环境对象
对于写入器,每个环境只能创建一个,完成写入操作后额外需要进行提交操作(commit
);如果再次写入,那么需要重新创建环境对象(写入器)
对于读取器,可以通过光标(cursor
)进行遍历;也可以通过键进行查找
相关实现
- 创建
.lmdb
文件:pnno pytorch
使用.lmdb
文件:lmdb_dataset.py