使用python读写lmdb数据库

lmdb 是Lightning Memory-Mapped Database, 一款内存映射型数据库,使用内存映射文件提供更好的输入输出性能,python读写lmdb非常方便,在一些小项目里使用lmdb可以高效存储和读取大量数据却不需要安装什么数据库。

内存映射(mmap)是一种内存映射文件的方法,原理上是将一个文件映射到进程的地址空间,这样文件磁盘地址和应用程序进程虚拟地址建立起一个映射关系。形成映射关系后,进程就可以采用指针的形式读写这一段内存,而系统则会自动将内存的数据回写到对应的文件磁盘上。

安装方式

pip install lmdb

1. 写数据

import lmdb


env = lmdb.open("./students")       # 打开数据库


txn = env.begin(write=True)         # 开启事务
txn.put(str(1).encode(), "xiaoming".encode())       # put 可以写入数据,也可以修改数据
txn.put(str(2).encode(), "xiaogang".encode())
txn.put(str(3).encode(), "xiaohong".encode())


txn.commit()        # 提交更改
env.close()

写入数据时,key和 value都必须是bytes类型, open数据时可以通过map_size参数设置创建的新数据库所需磁盘空间的最小值, 默认值是10485760,单位是字节。

2. 读取数据

import lmdb


env = lmdb.open("./students")       # 打开数据库


txn = env.begin()               # 开启事物
print(txn.get("1".encode()))    # 查询一个key的值

for key, value in txn.cursor():     # 通过cursor()遍历所有数据和键值
    print(key, value)

env.close()

3. 删除数据

import lmdb


env = lmdb.open("./students")       # 打开数据库


txn = env.begin(write=True)                 # 开启事物
txn.delete("1".encode())                    # 删除key 1

for key, value in txn.cursor():             # 通过cursor()遍历所有数据和键值
    print(key, value)

env.close()

如果需要对数据进行修改,必须在begin方法里设置write参数为True。

4. 使用场景

神经网络大型数据集ImageNet 就是存储在lmdb数据中,如果你有大量的key-value形式的数据需要存储且不需要远程访问,那么lmdb就非常合适。
图片,文件,如果量很大,也可以使用lmdb来存储,所有数据都放在一个文件中避免了文件系统寻址的开销。

扫描关注, 与我技术互动

QQ交流群: 211426309

加入知识星球, 每天收获更多精彩内容

分享日常研究的python技术和遇到的问题及解决方案