Py之lmdb:lmdb的简介、安装、使用方法之详细攻略

简介: Py之lmdb:lmdb的简介、安装、使用方法之详细攻略

lmdb的简介

image.png



       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

image.png





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()


 


相关文章
|
机器学习/深度学习 数据采集 人工智能
机器学习基础知识——基本原理、常用算法与评估指标
机器学习基础知识——基本原理、常用算法与评估指标
2147 0
|
11月前
|
NoSQL 网络协议 Redis
解决:启动Redis报错
当 Redis 启动报错“Could not create *:6379”时,可能是端口占用或配置问题。解决方法:依次运行以下命令——先通过 `redis-cli.exe` 进入命令行并执行 `shutdown` 关闭服务,再用 `exit` 退出工具,最后通过 `redis-server.exe redis.windows.conf` 重启 Redis。此操作可有效释放端口并正常启动 Redis 服务。
1147 1
|
9月前
|
JavaScript API 开发者
Uniapp开发鸿蒙应用教程之选项式api和组合式api
本文介绍了在Uniapp开发鸿蒙应用时,如何通过选项式API和组合式API进行数据操作。以修改年龄值为例,对比展示了两种API的代码结构与区别,并重点演示了组合式API中更简洁、灵活的写法,帮助开发者理解并掌握现代Vue开发模式。#鸿蒙三方框架 #Uniapp
|
机器学习/深度学习 缓存 PyTorch
异步数据加载技巧:实现 DataLoader 的最佳实践
【8月更文第29天】在深度学习中,数据加载是整个训练流程中的一个关键步骤。为了最大化硬件资源的利用率并提高训练效率,使用高效的数据加载策略变得尤为重要。本文将探讨如何通过异步加载和多线程/多进程技术来优化 DataLoader 的性能。
2601 1
|
数据采集 机器学习/深度学习 存储
性能调优指南:针对 DataLoader 的高级配置与优化
【8月更文第29天】在深度学习项目中,数据加载和预处理通常是瓶颈之一,特别是在处理大规模数据集时。PyTorch 的 `DataLoader` 提供了丰富的功能来加速这一过程,但默认设置往往不能满足所有场景下的最优性能。本文将介绍如何对 `DataLoader` 进行高级配置和优化,以提高数据加载速度,从而加快整体训练流程。
2778 0
|
缓存 安全 Linux
本地YUM源大揭秘:搭建您自己的Linux软件宝库,从此告别网络依赖!一文掌握服务器自给自足的终极技能!
【8月更文挑战第13天】在Linux中,YUM是一款强大的软件包管理工具,可自动处理依赖关系。为适应离线或特定安全需求,本指南教你搭建本地YUM源。首先创建存放软件包的`localrepo`目录,复制`.rpm`文件至其中。接着,安装并运用`createrepo`生成仓库元数据。随后配置新的`.repo`文件指向该目录,并禁用GPG检查。最后,清理并重建YUM缓存,即可启用本地YUM源进行软件搜索与安装,适用于网络受限环境。
1369 3
|
存储 SQL JSON
介绍一下RDBMS和NoSQL数据库之间的区别
【10月更文挑战第21天】介绍一下RDBMS和NoSQL数据库之间的区别
547 2
|
Ubuntu Linux Docker
弃用Docker Desktop:在WSL2中玩转Docker之Docker Engine 部署与WSL入门
弃用Docker Desktop:在WSL2中玩转Docker之Docker Engine 部署与WSL入门
24218 4
|
机器学习/深度学习 并行计算 PyTorch
【已解决】RuntimeError: CUDA error: device-side assert triggeredCUDA kernel errors might be asynchronous
【已解决】RuntimeError: CUDA error: device-side assert triggeredCUDA kernel errors might be asynchronous
11385 2
|
机器学习/深度学习 算法 Go
YOLOv5网络结构解析
YOLOv5网络结构解析

热门文章

最新文章