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