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
版本问题是比较常见的,另外最好就是虚拟环境安装,保持隔离性。