1. 程式人生 > >PYTHON上數據儲存:推薦h5py

PYTHON上數據儲存:推薦h5py

borde nta 但是 () 多好 end get 坑爹 ubun

最近在做一個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

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")

前面的方法會好用點

PYTHON上數據儲存:推薦h5py