一、HDF5文件介绍
Hierarchical Data Format Version 5, HDF5: 层次性数据格式第五版
是一种存储相同类型数值的大数组的机制,适用于可被层次性组织且数据集需要被元数据标记的数据模型
常用的接口模块为 h5py
HDF5 三大要素:
hdf5 files: 能够存储两类数据对象 dataset 和 group 的容器,其操作类似 python 标准的文件操作;File 实例对象本身就是一个组,以 / 为名,是遍历文件的入口
datasetarray-like): 可类比为 Numpy 数组,每个数据集都有一个名字(name)、形状(shape) 和类型(dtype),支持切片操作
groupfolder-like): 可以类比为 字典,它是一种像文件夹一样的容器;group 中可以存放 dataset 或者其他的 group,键就是组成员的名称,值就是组成员对象本身组或者数据集)
在深度学习中,通常会使用巨量的数据或图片来训练网络,比如ImageNet上就有数百万张图片。对于如此大的数据集,如果对于每张图片都单独从硬盘读取、预处理、之后再送入网络进行训练、验证或是测试,这样效率可是太低了。如果将这些图片都放入一个文件中再进行处理,这样效率会更高。有多种数据模型和库可完成这种操作,如HDF5和TFRecord。这篇文章中会介绍如何将大量的图片存入单个HDF5文件中,以及如何将它们按batch读出来。不论数据多大,即不论数据是否大于电脑内存,该方法都是有效的。HDF5提供了工具,可用于对数据进行管理、操作、可视化、压缩和存储等。
一个HDF5文件是一种存放两类对象的容器:dataset和group. Dataset是类似于数组的数据集,而group是类似文件夹一样的容器,存放dataset和其他group。在使用h5py的时候需要牢记一句话:groups类比词典,dataset类比Numpy中的数组。
HDF5的dataset虽然与Numpy的数组在接口上很相近,但是支持更多对外透明的存储特征,如数据压缩,误差检测,分块传输。
深度学习中也常用HDF5存储模型文件或数据集
import h5py #导入工具包
import numpy as np
#HDF5的写入:
imgData = np.zeros30,3,128,256))
f = h5py.File'HDF5_FILE.h5','w') #创建一个h5文件,文件指针是f
f['data'] = imgData #将数据写入文件的主键data下面
f['labels'] = range100) #将数据写入文件的主键labels下面
f.close) #关闭文件 #HDF5的读取:
f = h5py.File'HDF5_FILE.h5','r') #打开h5文件
f.keys) #可以查看所有的主键
a = f['data'][:] #取出主键为data的所有的键值
f.close)
二、HDF5: 读写速度与文件的大小
HDF5是一种优秀的文件格式,特别是对于大型的文件,是一个很好的选择。
任何事情都是一个平衡,当源文件是.csv文件时,你转为HDF5文件,你的目标是什么,要读(写)速度,还是HDF5文件的大小?
一、效率与文件的大小两者不可兼得
HDF5文件,如果不采用压缩的方式,格式会比源文件大不小,以CSV为例,可能会增大不少。但是在没有压缩的情况下,速度是最佳的。
如果你不仅需要速度,而且还需要控制文件的大小,这时,你可以选择压缩的方式,常用的有gzip,lzf等。这两者差异不太大,总体上差不多。lzf方式可能稍好一些,可能不同的环境下,得到的情况有所不同。
在控制文件大小的同时,这个效率的损失有多大?
我有一个CSV文件夹,CSV总大小约59.3M =>
gzip compress-level 2 =>8.5 M 读速度:0.5s
gzip compress-level 6 =>7.3M 读速度: 0.7s (compress level 0-9值)
lzf =>13M 读速度:0.4s (无compress level)
不压缩的情况是多少 =>76M 读速度:0.15s
我这里不是用SSD,如果用SSD的话,速度可能还会快不少。
三、场景的选择
有些情况下,存储资源紧张,有时侯需要更快的读取效率,具体要看具体场景需要。
创作打卡挑战赛赢取流量/现金/CSDN周边激励大奖