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、添加环境变量:

       gedit ~/.bashrc

  export PATH=/usr/local/hdf5:$PATH

  到这里HDF5就安装好了,只有安装好的HDF5才能顺利安装h5py

5、pip install h5py


简易例程:

写入:import h5pyimport numpy as np

1
2
3
4
5
6
<em id = "__mceDel" ><em id = "__mceDel" ><em id = "__mceDel" >data = mp.array( [ 222 , 333 , 444 ] )<br>label = np.array( [ 0 , 1 , 0 ] )<br>img_num = np.array( [ 0 , 1 , 2 ] )<br><br> # 创建HDF5文件<br>file = h5py.File('TrainSet_rotate.h5','w')<br># 写入
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)
# 。。。。。。。。。<br>file.close()
< / em>< / em>< / em>

读取:

1
2
3
4
5
6
7
8
9
10
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、

1
2
3
for i in range ( 10 ):
     print ( "Loading" + "." * i)
     sys.stdout.write( "\033[F" ) # Cursor up one line

2、

1
2
3
for x in range ( 0 , 5 ): 
     b = "Loading" + "." * x
     print (b, end = "\r" )

前面的方法会好用点


 

原来20分钟也可以来一篇小博客……看来以后得勤奋点才行了……

  • 1
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值