Python对于lmdb(Lightning Memory-Mapped Database)闪电式内存映射数据库的使用

        lmdb(Lightning Memory-Mapped Database)是一款开源的高效的内存映射型数据库,不属于关系型数据库,保存的是key-value的键值对,C语言开发的,对其源码感兴趣的可以参阅:https://github.com/LMDB/lmdb 由于速度很快,所以很适合存储深度学习中的大型数据集。
除了源码编译安装之外,主要用于模型的训练,下面使用Python的安装与使用
虚拟环境安装:conda install python-lmdb 或:pip install lmdb

操作lmdb

import lmdb
#若目录不存在将自动创建
env = lmdb.open('lmdbtest', map_size=10*1024*1024)#会生成一个10M的data.mdb数据库文件和一个8KB大小的lock.mdb锁文件

#创建事务对象
env = lmdb.open('lmdbtest')
Tobj = env.begin(write=True)
#插入数据,键值对,需对输入进行编码为bytes格式
Tobj .put(str(1).encode(), "Tony".encode())
Tobj .put(str(2).encode(), "张三".encode())
Tobj .commit()

#查看插入的数据
Tobj=env.begin()
print(Tobj.get(str(2).encode()).decode())#张三

#删除数据
Tobj=env.begin(write=True)
Tobj.delete(str(2).encode())
Tobj .commit()

如果进行写操作,没有指定write=True就会报错:lmdb.ReadonlyError: mdb_del: Permission denied

#遍历
Tobj = env.begin()
cur = Tobj.cursor()
for key, value in cur:
    print(key, value)
'''
b'1' b'Tony'
b'2' b'\xe5\xbc\xa0\xe4\xb8\x89'
b'3' b'Tony1'
'''
#中文需要解码


#更新操作
Tobj =env.begin(write=True)
Tobj.put(str(1).encode(), '傻瓜'.encode())
Tobj.commit()

上面就是常见的增删改查操作。用完之后关闭数据库的操作:env.close()
我们知道读写磁盘的速度是很慢的,特别是对于大型的图像训练数据集来说,频繁的磁盘IO操作会变得效率很低,所以将大量的图片都统一编码保存到这个数据库里面,这样访问就非常快了。

存储图片

import lmdb

env = lmdb.open('dbtest')
img_path = '../imgs/profile.jpg'
label = 'tony'
img_dic = {}
with open(img_path, 'rb') as f:
    img_bin = f.read()
img_dic['img0'] = img_bin
img_dic['label0'] = label
with env.begin(write=True) as Tobj:
    for k, v in img_dic.items():
        if isinstance(v, bytes):
            Tobj.put(k.encode(), v)
        else:
            Tobj.put(k.encode(), v.encode())
env.close()

读取图片

import cv2
import lmdb
import numpy as np

env = lmdb.open('dbtest')

print(cv2.__version__) #4.5.4
with env.begin() as Tobj:
    img_bin = Tobj.get('img0'.encode())
    label = Tobj.get('label0'.encode())
    img_buf = np.frombuffer(img_bin, dtype=np.uint8)
    #cv2.IMREAD_GRAYSCALE为灰度图,cv2.IMREAD_COLOR为彩色图
    img = cv2.imdecode(img_buf, cv2.IMREAD_COLOR)
    cv2.imshow('image', img)
    cv2.waitKey(0)

cv2模块的错误处理

import cv2

ModuleNotFoundError: No module named 'cv2'
pip install opencv-python
pip install opencv-contrib-python#还需要contrib模块就安装这个

安装之后出现如下错误:

  File "D:\Anaconda3\lib\site-packages\cv2\__init__.py", line 4, in <module>
    from .cv2 import *
ImportError: DLL load failed: 找不到指定的模块。

试试离线安装,opencv-python 下载下来再pip install ...

这玩意需要安装 Visual C++ Redistributable for Visual Studio 2015 没有安装的需要安装!

还没有成功就使用虚拟环境的安装:

(pytorch) C:\Users\Tony>conda install opencv-python
Fetching package metadata .........

PackageNotFoundError: Packages missing in current channels:

  - opencv-python

We have searched for the packages in the following channels:

  - http://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free/win-64
  - http://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free/noarch
  - http://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/conda-forge/win-64
  - http://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/conda-forge/noarch
  - http://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/msys2/win-64
  - http://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/msys2/noarch

难道清华镜像没有收录吗,于是换一种方法:conda install -c fastai opencv-python-headless

如果还是有问题,那就指定版本安装:pip install opencv-python==4.5.4.60
版本问题是比较常见的,另外最好就是虚拟环境安装,保持隔离性。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

寅恪光潜

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值