杂: PYTHON上数据储存:推荐h5py
一篇很短的小短文,主要推荐下做科学计算是大量数据的储存问题
最近在做一个CNN的项目,文件夹里有20w张图片要读入并保存到一个data文件(不然每次都读20w文件太麻烦)。
折腾了一个下午,发现了一个极好用的包 h5py:将数据储存在hdf5文件中。
这东西有多好用呢?
速度,内存占用,压缩程度都比cPickle+gzip来的优秀。
相比之下上面两个变逗比了……
我把所有图片都放在一个ndarray并保存为一个文件:
8190张图片的.mat 16GB, 81900图片的.pkl.gz……根本就生成不了, 81900张图片的.h5 15GB.
不仅可以保存大数据,而且压缩率是mat的十倍!
可见为什么我这么兴奋来一发……
说说h5py其他方式的缺点:
1、numpy.save , numpy.savez , scipy.io.savemat
numpy和scipy提供的数据存储方法。官方说savez是save的压缩版,尽管在实践中,什么都没能压缩到。
而且这三个方法产生的文件大小都是一样的…………非常大。
8000张256*256*3的图片出来就是一个16G的文件,简直忍无可忍。而且调用方法很麻烦。
2、cPickle + gzip
这里忽略pickle这家伙,直接被cPiclke虐了。
.pkl.gz 是mnist的官方后缀。看来是会很好用的样子。
但是实际使用中,有两个难以避免的问题:
- 速度慢,内存占用高(就是性能不好)
- 大矩阵储存无能
前者我就不说了。关于后者,这是python官bug,如果你在cPickle.dump()的时候碰上“ SystemError: error return without exception set”,那么恭喜你,中奖了。
python官方对于这个问题的解释:http://bugs.python.org/issue11564
咦?修好了?毛线! 3修好了,2.7照样bug,所以如果你的linux或者ubuntu内嵌的是python2.7,哭死吧。
尽管cPickle+gzip性能已经很优秀,但是和h5py性能的对比,看这篇:
http://www.shocksolution.com/2010/01/storing-large-numpy-arrays-on-disk-python-pickle-vs-hdf5adsf/
3、h5py
抱歉找不到缺点,唯一的缺点就是很难安装。所以一下是h5py安装教程。
h5py安装:
官方教程:http://docs.h5py.org/en/latest/build.html#install
这里教教你,官方教程都是坑爹的:没有源叫你apt-get,给你bin让你make。所以这里, 我走过能行的路:
1、确定系统有python,numpy,libhdf5-serial-dev,和HDF5.前三者一般都有。这里要安装HDF5
2、去HDF5官方网站下载编译好的bin(是的,尽管教程让编译,这里给用户的就是编译好的bin,搞得我这小白编译了半天);
http://www.hdfgroup.org/HDF5/
3、解压,重命名文件夹为hdf5,移动到 /usr/local/hdf5 下
4、添加环境变量:
export HDF5_DIR=/usr/local/hdf5
到这里HDF5就安装好了,只有安装好的HDF5才能顺利安装h5py
5、pip install h5py
简易例程:
写入:import h5pyimport numpy as np
data = mp.array( [222,333,444] )
label = np.array( [0,1,0] )
img_num = np.array( [0,1,2] ) # 创建HDF5文件
file = h5py.File('TrainSet_rotate.h5','w')
# 写入
file.create_dataset('train_set_x', data = data)
file.create_dataset('train_set_y', data = label)
file.create_dataset('train_set_num',data = img_num)
# 。。。。。。。。。
file.close()
读取:
import numpy as np
import h5py
# 读方式打开文件
file=h5py.File('TrainSet_rotate.h5','r')
# 尽管后面有 '[:]', 但是矩阵怎么进去的就是怎么出来的,不会被拉长(matlab后遗症)
train_set_data = file['train_set_x'][:]
train_set_y = file['train_set_y'][:]
train_set_img_num = file['train_set_img_num'][:]
# .........
file.close()
好了,你已经会使用h5py了,快尝试下h5py给你带来的快感吧!
附送小技巧:如何在同一行输出
1、
for i in range(10):
print("Loading" + "." * i)
sys.stdout.write("\033[F") # Cursor up one line
2、
for x in range (0,5):
b = "Loading" + "." * x
print (b, end="\r")
前面的方法会好用点
原来20分钟也可以来一篇小博客……看来以后得勤奋点才行了……
杂: PYTHON上数据储存:推荐h5py的更多相关文章
- python上数据存储 .h5格式或者h5py
最近在做城市计算的项目,数据文件是以.h5的格式存储的,总结下其用法和特点 来自百度百科的简介: HDF(Hierarchical Data Format),可以存储不同类型的图像和数码数据的文件格式 ...
- (数据科学学习手札06)Python在数据框操作上的总结(初级篇)
数据框(Dataframe)作为一种十分标准的数据结构,是数据分析中最常用的数据结构,在Python和R中各有对数据框的不同定义和操作. Python 本文涉及Python数据框,为了更好的视觉效果, ...
- python网络爬虫-数据储存(七)
数据储存 主要介绍两种数据储存方法: 储存在文件中,包括text文件和csv文件 存储在数据库中,包括MySQL关系型数据库和mongoDB数据库 存储到txt title = "第一个文本 ...
- 学习推荐《零起点Python大数据与量化交易》中文PDF+源代码
学习量化交易推荐学习国内关于Python大数据与量化交易的原创图书<零起点Python大数据与量化交易>. 配合zwPython开发平台和zwQuant开源量化软件学习,是一套完整的大数据 ...
- python数据储存
python数据储存 csv文件的操作 安装csv包打开cmd 执行 pip install csv引入的模块名为csv 读取文件 with open("xx.csv"," ...
- 一:1.1 python程序与数据储存【进制转换】
二进制 :0 1 [逢二进一]0+0=00+1=11+1=1011+1=100 1 1+ 1------ 100 八进制: 0 1 2 3 4 5 6 7 [逢八进一] 1+7=101+2=3 十进制 ...
- python和数据科学(Anaconda)
Python拥有着极其丰富且稳定的数据科学工具环境.遗憾的是,对不了解的人来说这个环境犹如丛林一般(cue snake joke).在这篇文章中,我会一步一步指导你怎么进入这个PyData丛林. 你可 ...
- 面试题汇总--数据储存/应用程序/UI控件/客户端的安全性与框架处理。。。
一 数据储存 1.如果后期需要增加数据库中的字段怎么实现,如果不使用 CoreData 呢?编写 SQL 语句来操作原来表中的字段1)增加表字段ALTER TABLE 表名 ADD COLUMN 字 ...
- 视频当道的时代,这些珍藏的优质 Python 播客值得推荐
我国互联网的发展道路与欧美不同,在内容的形式上,我们似乎实现了跨越式的发展——早早进入了移动互联网时代,直播和短视频等形式的内容成为了潮流,而文字形式的博客(blog)与声音形式的播客(podcast ...
随机推荐
- caffe测试mnist问题-error while loading shared libraries
问题描述 build/examples/mnist/convert_mnist_data.bin: error while loading shared libraries: libcudart.so ...
- HTTPS网站的内幕
什么是HTTPS网站? HTTPS可以理解为HTTP+TLS,HTTP是互联网中使用最为广泛的协议,目前大部分的WEB应用和网站都是使用HTTP协议传输. 那网站为什么要实现HTTPS? 一言概之,为 ...
- ElasticSearch(六):IK分词器的安装与使用IK分词器创建索引
之前我们创建索引,查询数据,都是使用的默认的分词器,分词效果不太理想,会把text的字段分成一个一个汉字,然后搜索的时候也会把搜索的句子进行分词,所以这里就需要更加智能的分词器IK分词器了. 1. i ...
- java时间处理--持续时间格式化工具和常量类DurationFormatUtils
阅读目录 DurationFormatUtils类简介 maven地址 构造方法 DurationFormatUtils() formatDurationHMS(long durationMillis ...
- jquery的常用操作(操作html页面的Dom对象的元素)
一:页面加载完成时,会执行jquery的方法(不需要等待图片加载完成,只要dom结构加载完成,就执行该方法) //第一种写法: $(document).ready(function() { // 执行 ...
- LG3377 【模板】左偏树(可并堆)
好博客 1 2 上面那个用数组写的跑的快,且便于封装,就用他的代码了. 代码 #include<cstdlib> #include<cstdio> #include<cm ...
- pandas 基础用法
pandas 是一个基于 Numpy 构建, 强大的数据分析工具包 主要功能 独特的数据结构 DataFrame, Series 集成时间序列功能 提供丰富的数学运算操作 灵活处理缺失数据 Serie ...
- GaugeControl 之 DigitalGauge
https://documentation.devexpress.com/#WindowsForms/clsDevExpressXtraGaugesWinGaugesDigitalDigitalGau ...
- C#处理Exception的常用方法总结
在.NET中,异常是指成员没有完成它的名称宣称可以完成的行动.在异常的机制中,异常和某件事情的发生频率无关. 异常处理四要素包括:一个表示异常详细信息的类类型:一个向调用者引发异常类实例的成员:调用 ...
- 理解JAVA虚拟机(下)
2016-04-18 20:40:59 三.JVM内存参数调整及监控 3.1 JVM之内存调整 JVM运行时数据区的内存大小可以通过参数来设置,通常能设置的两块区域为堆空间和持久代(方法区),设置方 ...