lmdb

LMDB的全称是Lightning Memory-Mapped Database(快如闪电的内存映射数据库),它的文件结构简单,包含一个数据文件和一个锁文件

  • env = lmdb.open():创建 lmdb 环境
  • txn = env.begin():建立事务
  • txn.put(key, value):进行插入和修改
  • txn.delete(key):进行删除
  • txn.get(key):进行查询
  • txn.cursor():进行遍历
  • txn.commit():提交更改
  • env.close():结束
1. 生成一个空的lmdb数据库文件
import lmdb

env=lmdb.open("../data/hjb",map_size=1099511627776)

env.close()

2. lmdb数据的添加,修改,查询和删除
import lmdb

env = lmdb.open("../data/hjb")

txn = env.begin(write=True)
#增
txn.put(key=str(1).encode(),value='hjb'.encode())
txn.put(key="hjb".encode(),value='zwy'.encode())
txn.put(key=str(3).encode(),value='sda'.encode())
#查
print(txn.get(str(3).encode()))
#删
txn.delete(str(1).encode())
print(txn.get(str(1).encode()))
#改
txn.put(key="hjb".encode(),value="yes".encode())
print(txn.get("hjb".encode()))

txn.commit()
#对LMDB的读写操作在事务中执行,需要使用 commit 方法提交待处理的事务。
#每次commit() 之后都要用 env.begin() 更新txn(得到最新的lmdb数据库)。

env.close()
b'sda'
None
b'yes'

3.cursor() 遍历数据库

遍历数据库中的所有记录,其返回一个可迭代对象,相当于关系数据库中的游标,每读取一次,游标下移一位。

import lmdb

env=lmdb.open("../data/hjb")

txn=env.begin(write=True)

for key,value in txn.cursor():
    print(key,value)

txn.commit()

env.close()
b'3' b'sda'
b'hjb' b'yes'

4. 图片数据示例

在深度学习训练中,一般会把大量原始数据集转化为lmdb格式方便后续的网络训练,因此需要对该数据集进行lmdb格式转化

将图片和对应的文本标签放到lmdb数据库

import lmdb

image_path='D:/hjb.jpg'
label='hjb'

env=lmdb.open('../data/hjb')

cache={} #存储{key,value}

#读取图像文件的二进制格式数据bytes
with open(image_path,'rb') as f:
    image_bin=f.read()

#用两个键值对表示一个数据样本
cache['image_000']=image_bin
cache['label_000']=label

with env.begin(write=True) as txn:
    for k,v in cache.items():
        if isinstance(v,bytes):
            #图片类型为bytes
            txn.put(k.encode(),v)
        else:
            #图片类型为str,转化为bytes
            txn.put(k.encode(),v.encode())

env.close()

从lmdb数据库中读取图片数据

import cv2
import lmdb
import numpy as np

env=lmdb.open('../data/hjb')

with env.begin(write=False) as txn:
    img_bin=txn.get('image_000'.encode())
    label=txn.get('label_000'.encode()).decode()
    #标签通过decode(),进行解码重新得到字符串格式

    #将二进制文件转为十进制文件(一维数组)
    image_buf=np.frombuffer(img_bin,dtype=np.uint8)
    #将数据转换为图像格式,使用 cv2.imdecode() 将其转换为灰度图(二维数组)或者彩色图(三维数组)。
    img=cv2.imdecode(image_buf,cv2.IMREAD_COLOR)

    cv2.imshow('image',img)
    cv2.waitKey(0)
  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
import lmdb是Python中使用lmdb数据库的模块。通过导入lmdb模块,我们可以在Python程序中使用lmdb数据库。下面是一个简单的例子,展示了如何使用lmdb模块创建和打开数据库、写入数据、读取数据、删除数据以及关闭数据库等操作: ```python import lmdb # 创建并打开一个名为mydb的数据库 env = lmdb.open('mydb') # 开始一个新的事务 with env.begin(write=True) as txn: # 向数据库中写入数据 txn.put(b'key', b'value') # 开始一个只读事务 with env.begin() as txn: # 从数据库中读取数据 value = txn.get(b'key') print(value) # 开始一个新的事务 with env.begin(write=True) as txn: # 从数据库中删除数据 txn.delete(b'key') # 关闭数据库 env.close() ``` 此外,上面提到的merge_lmdb函数可以将两个lmdb文件合并成一个新的lmdb文件。具体实现可以参考以下代码: ```python import lmdb # 将两个lmdb文件合并成一个新的lmdb def merge_lmdb(lmdb1, lmdb2, result_lmdb): print('Merge start!') # 打开两个原始lmdb文件 env1 = lmdb.open(lmdb1) env2 = lmdb.open(lmdb2) # 打开新的lmdb文件 env_result = lmdb.open(result_lmdb, map_size=env1.info()['map_size'] + env2.info()['map_size']) # 开始一个新的事务 with env_result.begin(write=True) as txn_result: # 遍历第一个lmdb文件 with env1.begin() as txn1: cursor1 = txn1.cursor() for key, value in cursor1: # 将数据写入新的lmdb文件 txn_result.put(key, value) # 遍历第二个lmdb文件 with env2.begin() as txn2: cursor2 = txn2.cursor() for key, value in cursor2: # 将数据写入新的lmdb文件 txn_result.put(key, value) # 关闭所有的lmdb文件 env1.close() env2.close() env_result.close() print('Merge complete!') ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值