python读取lmdb文件_使用python制作LMDB数据库
## 1. LMDB简介
LMDB的全称是Lighting Memory-Mapped Database(闪电般的内存映射数据库)。它的结构很简单,一个文件夹,里面一个数据文件,一个锁文件。数据随意复制,随意传输。它的访问简单,不需要单独的数据管理进程。只要在访问代码里引用LMDB库,访问时给文件路径即可。
Caffe中使用的数据结构很简单,就是大量的矩阵和向量。数据之间没有关联,数据内没有复杂的对象结构,就是矩阵和向量。既然数据不复杂,Caffe就选择了LMDB这个简单的数据库来存放数据。
Caffe使用LMDB数据库,有以下两点原因:
- 数据源的格式多样性,有文本文件、二进制文件、图像文件等等,不可能用一个代码完成上述所有的数据格式。因此,要通过LMDB数据库,转化成统一的数据格式可以简化数据读取层的实现。
- 使用LMDB数据库可以大大节约磁盘IO的时间开销。因此,我们都有体会,一个具有几万个、几十万个文件的数据集,不管是直接复制,还是打开再解包,过程都巨慢无比。LMDB只有一个文件,你的介质有多快,就能复制多快,不会因为文件多而慢的令人心碎。
## 2. 环境配置
首先我们需要python包lmdb和caffe的python接口pycaffe。LMDB提供键值对的存储方式,其中每一个键值对就是我们数据集的一个样本。一般而言,键代表ID字符串,值代表序列化后的Caffe框架的Datum类(使用protobuf编译)。
## 3. Caffe中的Datum数据结构
Caffe中并不是把向量和矩阵直接放进数据库,而是将数据通过`caffe.proto`里定义的一个`Datum`类来封装,数据库中存放的是一个个Datum对象序列化成的字符串。Datum的定义如下:
message Datum {
optional int32 channels = 1;
optional int32 height = 2;
optional int32 width = 3;
// the actual image data, in bytes
optional bytes data = 4;
optional int32 label = 5;
// Optionally, the datum could also hold float data.
repeated float float_data = 6;
// If true data contains an encoded image that need to be decoded
optional bool encoded = 7 [default = false];
}
## 4. 创建LMDB数据库
```python
import lmdb
import numpy as np
import cv2
import caffe
from caffe.proto import caffe_pb2
#basic setting
lmdb_file = 'lmdb_data'
batch_size = 256
# create the lmdb file
lmdb_env = lmdb.open(lmdb_file, map_size=int(1e12))
lmdb_txn = lmdb_env.begin(write=True)
datum = caffe_pb2.Datum()
item_id = -1
for x in range(1000):
item_id += 1
#prepare the data and label
data = np.ones((3,64,64), np.uint8) * (item_id%128 + 64) #CxHxW array, uint8 or float
label = item_id%128 + 64
# save in datum
datum = caffe.io.array_to_datum(data, label)
keystr = '{:0>8d}'.format(item_id)
lmdb_txn.put( keystr, datum.SerializeToString() )
# write batch
if(item_id + 1) % batch_size == 0:
lmdb_txn.commit()
lmdb_txn = lmdb_env.begin(write=True)
print (item_id + 1)
# write last batch
if (item_id+1) % batch_size != 0:
lmdb_txn.commit()
print 'last batch'
print (item_id + 1)
```
## 5. 读取LMDB
```python
import caffe
import lmdb
import numpy as np
import cv2
from caffe.proto import caffe_pb2
lmdb_env = lmdb.open('lmdb_data')
lmdb_txn = lmdb_env.begin()
lmdb_cursor = lmdb_txn.cursor()
datum = caffe_pb2.Datum()
for key, value in lmdb_cursor:
datum.ParseFromString(value)
label = datum.label
data = caffe.io.datum_to_array(datum)
#CxHxW to HxWxC in cv2
image = np.transpose(data, (1,2,0))
cv2.imshow('cv2', image)
cv2.waitKey(1)
print('{},{}'.format(key, label))
```
python读取lmdb文件_使用python制作LMDB数据库相关推荐
- python读取xls文件_从python中的xls读取unicode
我正在尝试使用 Python读取.xls文件.该文件包含多个非ascii字符(即äöü).我已经尝试过使用openpyxls和xlrd(我对xlrd寄予厚望,因为它无论如何都会读取unicode中的所 ...
- 怎么用python读取大文件_使用Python读取大文件的方法
背景准备试一试:f =开放(\u201C\/道路\/ \/文件\u201D,\u201Cr\u201D)打印()最后:如果f:()调用读()将读取所有文件的内容,如果文件有10 g,记忆会破灭,所以, ...
- python读取sav文件_在Python中读取SPSS(.sav)文件时,获取“title already used as a name or title”错误...
我正在读一个SPSS文件(.sav).我下面的代码可以读取.sav文件.但是,我遇到了一个非常奇怪的错误.当我试图读取另一个.sav文件时,它会给出以下错误Traceback (most recent ...
- python读取svg文件_使用python创建SVG
我正在构建一组SVG文件,其中包含大量的硬编码值(它们必须打印一些大小为m m的元素,而其他元素必须按百分比缩放,并且大多数值都是相对定义的).我不想用手来管理这些数字(但愿我不想改变一些事情),我想 ...
- python读取rtf文件_【Python】【IO】文件读写
一.打开的文件在使用完后要关闭 >>>f=file('fibs.py') #用''表示文件名 #无''表示变量名 >>>f.read() #打印fibs.py中的内 ...
- python读取rar文件_在 python 中,如何读取由 7z 压缩的文本文件_python_酷徒编程知识库...
这允许你stream行.import os import py7zlib class SevenZFileError(py7zlib.ArchiveError): pass class SevenZF ...
- python读取rtf文件_使用Python读取RTF文件时出现欧元符号问题
RTF标准使用UTF-16,但其形状适合RTF命令序列格式.记录在http://en.wikipedia.org/wiki/Rich_Text_Format#Character_encoding.不幸 ...
- python读取大文件-强悍的Python读取大文件的解决方案
Python 环境下文件的读取问题,请参见拙文 Python基础之文件读取的讲解 这是一道著名的 Python 面试题,考察的问题是,Python 读取大文件和一般规模的文件时的区别,也即哪些接口不适 ...
- python读取超大文件-强悍的Python读取大文件的解决方案
Python 环境下文件的读取问题,请参见拙文 Python基础之文件读取的讲解 这是一道著名的 Python 面试题,考察的问题是,Python 读取大文件和一般规模的文件时的区别,也即哪些接口不适 ...
- python读取txt文件为dataframe,python批量读取txt文件为DataFrame
我们有时候会批量处理同一个文件夹下的文件,并且希望读取到一个文件里面便于我们计算操作.比方我有下图一系列的txt文件,我该如何把它们写入一个txt文件中并且读取为DataFrame格式呢? 首先我们要 ...
最新文章
- Java 8为什么会移除APT以及mirror API?
- Javascript(JS)中的大括号{}和中括号[]详解
- SQL基础--过滤和排序
- python从事哪些职业好玩_Python就业可选方向有哪些?带你了解Python主流职业选择!...
- python中面向切片编程(AOP)和装饰器
- python filter函数中写none_Python3基础 filter 第一个参数为NONE时 结果只返回为True的对象...
- STM32 DSP库的使用方法
- BugkuCTF-Reverse题入门逆向多解法
- Intellij idea添加单元测试工具
- ggThemeAssist|鼠标调整主题,并返回代码
- Java this, super深入理解
- 【Python】int binary str 互转
- MySQL数据库基础命令
- 开放世界游戏中的大地图背后有哪些实现技术?
- android手机设置固定dns,手机怎么设置dns 手机设置dns方法【详解】
- HDU 6148 Valley Numer (数位dp)
- 云超融合数据中心 CloudFabric
- linux 设置系统时钟,linux clock命令查看和设置硬件时钟
- mysql怎么增加内存_MySQL内存不足怎么办
- c语言进阶编程 培训,大学C语言进阶编程实例.doc
热门文章
- java语言扫雷游戏的实验设计_java扫雷游戏计算机毕业设计中期检查表、中期报告.doc...
- 3. (5.18~5.25)2022年自动化保研信息+分析汇总(夏令营)
- 如何撰写总体设计与详细设计文档
- 应该如何写详细设计文档
- 云端软件关闭的原因是什么?
- 计算机组老师颁奖词,学校优秀老师颁奖词
- FastFDS 分布式文件系统
- 海量前端后台Java源码模板下载
- bs结构管理系统 服务器多少钱,购买BS或CS架构的进销存软件哪个更划算
- html网页制作代码大全:庆余年——电影网站7页,不包含js 有登陆注册,表格 table布局 ,有的登录注册页面,内嵌 css