lmdb的简介
LMDB,即Lightning Memory-Mapped Database Manager 闪电内存映射数据库管理器。是一个基于btree的数据库管理库,松散地建模于BerkeleyDB API,但是进行了很多简化。整个数据库在内存映射中公开,所有数据获取都直接从映射的内存返回数据,因此在数据获取期间不会出现malloc或memcpy。因此,这个库非常简单,因为它本身不需要页面缓存层,而且它的性能和内存效率都非常高。它也是完全事务性的,具有完整的ACID语义,当内存映射为只读时,不能通过从应用程序代码中编写游离指针来破坏数据库完整性。
该库完全支持线程感知,并支持来自多个进程和线程的并发读/写访问。数据页使用复制即写策略,因此不会覆盖任何活动的数据页,这也提供了对损坏的抵抗力,并消除了系统崩溃后任何特殊恢复过程的需要。写被完全序列化;一次只能有一个写事务是活动的,这就保证了写事务不会死锁。数据库结构是多版本的,因此读取器运行时没有锁;作家不能阻止读者,读者也不会阻止作家。
与其他使用写前事务日志或仅追加数据写的著名数据库机制不同,LMDB在操作期间不需要维护。写前日志记录器和仅追加的数据库都需要定期检查点和/或压缩它们的日志或数据库文件,否则它们会无限制地增长。LMDB跟踪数据库中的空闲页面,并将它们用于新的写操作,因此在正常使用中,数据库大小不会无限制地增长。
内存映射可以用作只读或读写映射。默认情况下它是只读的,因为这提供了对损坏的完全免疫力。使用读写模式提供了更高的写性能,但也增加了应用程序通过指向静默破坏数据库的指针进行写操作的可能性。当然,如果您的应用程序代码已知是无bug的(…),那么这就不是问题。
lmdb是一款开源的高效快速的内存映射数据库,C语言编写,基于B+树索引,支持MVCC事务处理。它不是一个需要独立运行的数据库管理进程,只要在需要访问lmdb数据库的代码里引用lmdb库,给出数据库所在目录,就能方便地实现读写lmdb数据库。
LMDB主页:http://www.lmdb.tech/doc/index.html
LMDB API:http://www.lmdb.tech/doc/group__mdb.html
GitHub:https://github.com/dw/py-lmdb/
lmdb的安装
pip install lmdb
lmdb的使用方法
1、python读写LMDB文件的方法
(1)、生成一个空的lmdb数据库文件
# -*- coding: utf-8 -*-
import lmdb
# 如果train文件夹下没有data.mbd或lock.mdb文件,则会生成一个空的,如果有,不会覆盖
# map_size定义最大储存容量,单位是kb,以下定义1TB容量
env = lmdb.open("./train",map_size=1099511627776)
env.close()
(2)、LMDB数据的添加、修改、删除
# -*- coding: utf-8 -*-
import lmdb
# map_size定义最大储存容量,单位是kb,以下定义1TB容量
env = lmdb.open("./train", map_size=1099511627776)
txn = env.begin(write=True)
# 添加数据和键值
txn.put(key = '1', value = 'aaa')
txn.put(key = '2', value = 'bbb')
txn.put(key = '3', value = 'ccc')
# 通过键值删除数据
txn.delete(key = '1')
# 修改数据
txn.put(key = '3', value = 'ddd')
# 通过commit()函数提交更改
txn.commit()
env.close()
(3)、查询lmdb数据库内容
# -*- coding: utf-8 -*-
import lmdb
env = lmdb.open("./train")
# 参数write设置为True才可以写入
txn = env.begin(write=True)
############################################添加、修改、删除数据
# 添加数据和键值
txn.put(key = '1', value = 'aaa')
txn.put(key = '2', value = 'bbb')
txn.put(key = '3', value = 'ccc')
# 通过键值删除数据
txn.delete(key = '1')
# 修改数据
txn.put(key = '3', value = 'ddd')
# 通过commit()函数提交更改
txn.commit()
############################################查询lmdb数据
txn = env.begin()
# get函数通过键值查询数据
print txn.get(str(2))
# 通过cursor()遍历所有数据和键值
for key, value in txn.cursor():
print (key, value)
############################################
env.close()
(4)、读取已有.mdb文件内容
# -*- coding: utf-8 -*-
import lmdb
env_db = lmdb.Environment('trainC')
# env_db = lmdb.open("./trainC")
txn = env_db.begin()
# get函数通过键值查询数据,如果要查询的键值没有对应数据,则输出None
print txn.get(str(200))
for key, value in txn.cursor(): #遍历
print (key, value)
env_db.close()