python读取lmdb文件_LMDB 的 Python 接口使用方法
MXNet中对classification任务提供了把训练图像数据转换成一个大的二进制文件的方法,但是,对于其它任务例如语义分割等,并没有提供类似的功能。这里,介绍一下如何使用LMDB的Python接口把语义分割训练数据的图像和标签转换成LMDB的文件。首先,这里简要介绍一下问什么要把图像文件转换成大的二进制文件。
为什么要转换
为什么要把很多图像文件转换成一个大文件?
简单来说,是因为读写小文件的速度太慢。那么, 不禁要问,图像数据也是二进制文件,单个大的二进制文件例如LMDB文件也是二进制文件,为什么单个图像读写速度就慢了呢?这里分两种情况解释。
机械硬盘的情况:机械硬盘的每次读写启动时间比较场,例如磁头的寻道时间占比很高,因此,如果单个小文件读写,尤其是随机读写单个小文件的时候,这个寻道时间占比就会很高,最后导致大量读写小文件的时候时间会很浪费;
NFS的情况:在NFS的场景下,系统的一次读写首先要进行上百次的网络通讯,并且这个通讯次数和文件的大小无关。因此,如果是读写小文件,这个网络通讯时间占据了整个读写时间的大部分。
固态硬盘的情况下应该也会有一些类似的开销,目前没有研究过。
LMDB 的使用方法
LMDB 是一个key value 内存映射的数据库。内存映射的意思就是说,LMDB在使用的时候,会把磁盘上的数据映射到内存中,因此,只顺序读写的情况下,相当于直接在内存中操作数据,因此速度很快。另外,在网络训练场景中存储的LMDB数据是一个二进制文件,因此,也克服了上一部分说的小文件读写的问题。
LMDB 写数据
这里展示一下如何把图像数据存储到LMDB中,基本上分为3个步骤:
创建LMDB文件
创建对应的database
向对应的database中写数据
注意,LMDB中的数据不会保存图像的shape信息,为了在读取数据的过程中正确地恢复出图像,需要知道图像的shape 信息。如果图像的shape全部是相同的,那么可以不用存储该信息,如果不同,也可以把该信息存储在LMDB中。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31def img2lmdb():
# 创建数据库文件
env = lmdb.open(cfg.dataset, max_dbs=4, map_size=int(1e12))
# 创建对应的数据库
train_data = env.open_db("train_data")
train_label = env.open_db("train_label")
val_data = env.open_db("val_data")
val_label = env.open_db("val_label")
train_image_list, train_label_list = get_image_label_list(train=True)
val_image_list, val_label_list = get_image_label_list(train=False)
# 把图像数据写入到LMDB中
with env.begin(write=True) as txn:
for idx, path in enumerate(train_image_list):
logging.debug("{} {}".format(idx, path))
data = read_fixed_image(path)
txn.put(str(idx), data, db=train_data)
for idx, path in enumerate(train_label_list):
logging.debug("{} {}".format(idx, path))
data = read_fixed_label(path)
txn.put(str(idx), data, db=train_label)
for idx, path in enumerate(val_image_list):
logging.debug("{} {}".format(idx, path))
data = read_fixed_image(path)
txn.put(str(idx), data, db=val_data)
for idx, path in enumerate(val_label_list):
logging.debug("{} {}".format(idx, path))
data = read_fixed_label(path)
txn.put(str(idx), data, db=val_label)
LMDB读数据
例子如下,不解释了~
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33class DataIter(gluon.data.Dataset):
def __init__(self, train=True):
env = lmdb.open(cfg.dataset, max_dbs=4, map_size=int(1e12), readonly=True)
self.train_data = env.open_db("train_data")
self.train_label = env.open_db("train_label")
self.val_data = env.open_db("val_data")
self.val_label = env.open_db("val_label")
self.txn = env.begin()
self._length = self.txn.stat(db=self.train_data)["entries"] if train else self.txn.stat(db=self.val_data)["entries"]
self.train = train
def __getitem__(self, idx):
idx = str(idx)
if self.train:
image = self.txn.get(idx, db=self.train_data)
image = np.frombuffer(image, 'uint8')
image = np.reshape(image, [4] + list(cfg.raw_size))
label = self.txn.get(idx, db=self.train_label)
label = np.frombuffer(label, 'uint8')
label = np.reshape(label, list(cfg.raw_size))
return nd.array(image), nd.array(label / 255.0)
else:
image = self.txn.get(idx, db=self.val_data)
image = np.frombuffer(image, 'uint8')
image = np.reshape(image, [4] + list(cfg.raw_size))
label = self.txn.get(idx, db=self.val_label)
label = np.frombuffer(label, 'uint8')
label = np.reshape(label, list(cfg.raw_size))
return nd.array(image), nd.array(label / 255.0)
def __len__(self):
return self._length
python读取lmdb文件_LMDB 的 Python 接口使用方法相关推荐
- python读取txt文件并求和,Python读取txt文件数据的方法(用于接口自动化参数化数据)...
小试牛刀: 1.需要python如何读取文件 2.需要python操作list 3.需要使用split()对字符串进行分割 代码运行截图 : 代码(copy) #encoding=utf-8 #1.r ...
- python读取大文件-强悍的Python读取大文件的解决方案
Python 环境下文件的读取问题,请参见拙文 Python基础之文件读取的讲解 这是一道著名的 Python 面试题,考察的问题是,Python 读取大文件和一般规模的文件时的区别,也即哪些接口不适 ...
- python读取超大文件-强悍的Python读取大文件的解决方案
Python 环境下文件的读取问题,请参见拙文 Python基础之文件读取的讲解 这是一道著名的 Python 面试题,考察的问题是,Python 读取大文件和一般规模的文件时的区别,也即哪些接口不适 ...
- python读取xls文件_从python中的xls读取unicode
我正在尝试使用 Python读取.xls文件.该文件包含多个非ascii字符(即äöü).我已经尝试过使用openpyxls和xlrd(我对xlrd寄予厚望,因为它无论如何都会读取unicode中的所 ...
- python读取txt文件为dataframe,python批量读取txt文件为DataFrame
我们有时候会批量处理同一个文件夹下的文件,并且希望读取到一个文件里面便于我们计算操作.比方我有下图一系列的txt文件,我该如何把它们写入一个txt文件中并且读取为DataFrame格式呢? 首先我们要 ...
- python读取grib文件_Windows下Python读取GRIB数据
之前写了一篇<基于Python的GRIB数据可视化>的文章,好多博友在评论里问我Windows系统下如何读取GRIB数据,在这里我做一下说明. 一.在Windows下Python为什么无法 ...
- 怎么用python读取大文件_使用Python读取大文件的方法
背景准备试一试:f =开放(\u201C\/道路\/ \/文件\u201D,\u201Cr\u201D)打印()最后:如果f:()调用读()将读取所有文件的内容,如果文件有10 g,记忆会破灭,所以, ...
- python读取csv文件_Hello,Python!小鲸教你Python之文件读取
关于类的课程我们已经结束啦,现在,我们开启关于Python的一段新旅程吧!大家要跟上小鲸的小红旗,带好小红帽,不要走错路了哦! 文件读取数据 我们在工作或者学习中,会接触到很多存储大量数据的文本文件: ...
- python读取txt文件写入失败-Python write 函数写文件失败
工作中涉及到了内容抓取的需求,用 Python 根据Url抓取对应的Html页面,并存储到本地文件,然后程序内继续将本地文件的路径作为参数,调用Node进行杂质过滤和内容提取.但怪的是在Python执 ...
- python读取sav文件_在Python中读取SPSS(.sav)文件时,获取“title already used as a name or title”错误...
我正在读一个SPSS文件(.sav).我下面的代码可以读取.sav文件.但是,我遇到了一个非常奇怪的错误.当我试图读取另一个.sav文件时,它会给出以下错误Traceback (most recent ...
最新文章
- 【转载】Session服务器配置指南与使用经验
- VCL 中的 Windows API 函数(6): BeginDeferWindowPos
- My Site Cleanup Job
- 在php storm中怎么搭建环境,PhpStorm搭建git环境
- 学习响应式BootStrap来写融职教育网站,Bootsrtap第十一天Dplayer播放器
- 10个你可能没用过的linux命令
- OpenInfra Days China 2020大会议程已上线!
- hooks组件封装 react_名符其实的react下一代状态管理器hox
- visio 图标_visio有效提升工作效率
- 万能模拟器eve-ng介绍
- Windows如何注册Com组件
- Java金融计算机计算irr_手把手教你使用金融计算器
- android 文件隐藏文件,安卓手机里的文件怎么隐藏?安卓手机隐藏文件夹的方法
- 测试开发工程师面试题目
- 电脑安全模式没有修复计算机,电脑没有安全模式怎么办
- BBUCTF消失的MD5题解
- 计算机用户名和密码在哪个文件夹,登陆邮箱、论坛等的帐号和密码存放在电脑中的哪个文件夹中?...
- Homebrew快速安装教程
- python编程midi键盘按键_python 偷懒技巧——使用 keyboard 录制键盘事件
- 找到一个在线网站截图的网站
热门文章
- 基于Springboot+vue的办公OA系统#毕业设计
- 雨林木风SP3YN9.9 装机版09年09月更新(终结版)
- 普通计算机用的是什么屏幕,笔记本屏幕的色域 72%NTSC和100%sRGB有什么区别
- 37--8位级联加法器,并行加法器
- 明晰监管范围保护信息安全
- ARKit玩起来 - AR卡通秀-史小川-专题视频课程
- 用acdsee制作html,ACDSee 制作网络像册
- 四川大学转专业到计算机学院面试,2016年本科生转专业工作面试通知
- 机器学习---黑箱原理
- 对比修改过的两个BOM表