## 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数据库相关推荐

  1. python读取xls文件_从python中的xls读取unicode

    我正在尝试使用 Python读取.xls文件.该文件包含多个非ascii字符(即äöü).我已经尝试过使用openpyxls和xlrd(我对xlrd寄予厚望,因为它无论如何都会读取unicode中的所 ...

  2. 怎么用python读取大文件_使用Python读取大文件的方法

    背景准备试一试:f =开放(\u201C\/道路\/ \/文件\u201D,\u201Cr\u201D)打印()最后:如果f:()调用读()将读取所有文件的内容,如果文件有10 g,记忆会破灭,所以, ...

  3. python读取sav文件_在Python中读取SPSS(.sav)文件时,获取“title already used as a name or title”错误...

    我正在读一个SPSS文件(.sav).我下面的代码可以读取.sav文件.但是,我遇到了一个非常奇怪的错误.当我试图读取另一个.sav文件时,它会给出以下错误Traceback (most recent ...

  4. python读取svg文件_使用python创建SVG

    我正在构建一组SVG文件,其中包含大量的硬编码值(它们必须打印一些大小为m m的元素,而其他元素必须按百分比缩放,并且大多数值都是相对定义的).我不想用手来管理这些数字(但愿我不想改变一些事情),我想 ...

  5. python读取rtf文件_【Python】【IO】文件读写

    一.打开的文件在使用完后要关闭 >>>f=file('fibs.py') #用''表示文件名 #无''表示变量名 >>>f.read() #打印fibs.py中的内 ...

  6. python读取rar文件_在 python 中,如何读取由 7z 压缩的文本文件_python_酷徒编程知识库...

    这允许你stream行.import os import py7zlib class SevenZFileError(py7zlib.ArchiveError): pass class SevenZF ...

  7. python读取rtf文件_使用Python读取RTF文件时出现欧元符号问题

    RTF标准使用UTF-16,但其形状适合RTF命令序列格式.记录在http://en.wikipedia.org/wiki/Rich_Text_Format#Character_encoding.不幸 ...

  8. python读取大文件-强悍的Python读取大文件的解决方案

    Python 环境下文件的读取问题,请参见拙文 Python基础之文件读取的讲解 这是一道著名的 Python 面试题,考察的问题是,Python 读取大文件和一般规模的文件时的区别,也即哪些接口不适 ...

  9. python读取超大文件-强悍的Python读取大文件的解决方案

    Python 环境下文件的读取问题,请参见拙文 Python基础之文件读取的讲解 这是一道著名的 Python 面试题,考察的问题是,Python 读取大文件和一般规模的文件时的区别,也即哪些接口不适 ...

  10. python读取txt文件为dataframe,python批量读取txt文件为DataFrame

    我们有时候会批量处理同一个文件夹下的文件,并且希望读取到一个文件里面便于我们计算操作.比方我有下图一系列的txt文件,我该如何把它们写入一个txt文件中并且读取为DataFrame格式呢? 首先我们要 ...

最新文章

  1. Java 8为什么会移除APT以及mirror API?
  2. Javascript(JS)中的大括号{}和中括号[]详解
  3. SQL基础--过滤和排序
  4. python从事哪些职业好玩_Python就业可选方向有哪些?带你了解Python主流职业选择!...
  5. python中面向切片编程(AOP)和装饰器
  6. python filter函数中写none_Python3基础 filter 第一个参数为NONE时 结果只返回为True的对象...
  7. STM32 DSP库的使用方法
  8. BugkuCTF-Reverse题入门逆向多解法
  9. Intellij idea添加单元测试工具
  10. ggThemeAssist|鼠标调整主题,并返回代码
  11. Java this, super深入理解
  12. 【Python】int binary str 互转
  13. MySQL数据库基础命令
  14. 开放世界游戏中的大地图背后有哪些实现技术?
  15. android手机设置固定dns,手机怎么设置dns 手机设置dns方法【详解】
  16. HDU 6148 Valley Numer (数位dp)
  17. 云超融合数据中心 CloudFabric
  18. linux 设置系统时钟,linux clock命令查看和设置硬件时钟
  19. mysql怎么增加内存_MySQL内存不足怎么办
  20. c语言进阶编程 培训,大学C语言进阶编程实例.doc

热门文章

  1. java语言扫雷游戏的实验设计_java扫雷游戏计算机毕业设计中期检查表、中期报告.doc...
  2. 3. (5.18~5.25)2022年自动化保研信息+分析汇总(夏令营)
  3. 如何撰写总体设计与详细设计文档
  4. 应该如何写详细设计文档
  5. 云端软件关闭的原因是什么?
  6. 计算机组老师颁奖词,学校优秀老师颁奖词
  7. FastFDS 分布式文件系统
  8. 海量前端后台Java源码模板下载
  9. bs结构管理系统 服务器多少钱,购买BS或CS架构的进销存软件哪个更划算
  10. html网页制作代码大全:庆余年——电影网站7页,不包含js 有登陆注册,表格 table布局 ,有的登录注册页面,内嵌 css