午夜视频在线网站,日韩视频精品在线,中文字幕精品一区二区三区在线,在线播放精品,1024你懂我懂的旧版人,欧美日韩一级黄色片,一区二区三区在线观看视频

分享

PYTHON上數(shù)據(jù)儲(chǔ)存:推薦h5py

 imelee 2017-02-09

PYTHON上數(shù)據(jù)儲(chǔ)存:推薦h5py,有需要的朋友可以參考下。



最近在做一個(gè)CNN的項(xiàng)目,文件夾里有20w張圖片要讀入并保存到一個(gè)data文件(不然每次都讀20w文件太麻煩)。



折騰了一個(gè)下午,發(fā)現(xiàn)了一個(gè)極好用的包 h5py:將數(shù)據(jù)儲(chǔ)存在hdf5文件中。



這東西有多好用呢?



速度,內(nèi)存占用,壓縮程度都比cPickle+gzip來的優(yōu)秀。



相比之下上面兩個(gè)變逗比了……



我把所有圖片都放在一個(gè)ndarray并保存為一個(gè)文件:



8190張圖片的.mat 16GB, 81900圖片的.pkl.gz……根本就生成不了, 81900張圖片的.h5 15GB.



不僅可以保存大數(shù)據(jù),而且壓縮率是mat的十倍!



可見為什么我這么興奮來一發(fā)……






說說h5py其他方式的缺點(diǎn):


1、numpy.save , numpy.savez , scipy.io.savemat



  numpy和scipy提供的數(shù)據(jù)存儲(chǔ)方法。官方說savez是save的壓縮版,盡管在實(shí)踐中,什么都沒能壓縮到。



  而且這三個(gè)方法產(chǎn)生的文件大小都是一樣的…………非常大。



  8000張256*256*3的圖片出來就是一個(gè)16G的文件,簡直忍無可忍。而且調(diào)用方法很麻煩。



2、cPickle + gzip



  這里忽略pickle這家伙,直接被cPiclke虐了。



  .pkl.gz 是mnist的官方后綴。看來是會(huì)很好用的樣子。



  但是實(shí)際使用中,有兩個(gè)難以避免的問題:





    • 速度慢,內(nèi)存占用高(就是性能不好)
    • 大矩陣儲(chǔ)存無能



  前者我就不說了。關(guān)于后者,這是python官bug,如果你在cPickle.dump()的時(shí)候碰上“SystemError:errorreturnwithoutexceptionset”,那么恭喜你,中獎(jiǎng)了。



  python官方對(duì)于這個(gè)問題的解釋:http://bugs./issue11564



  咦?修好了?毛線! 3修好了,2.7照樣bug,所以如果你的linux或者ubuntu內(nèi)嵌的是python2.7,哭死吧。



  盡管cPickle+gzip性能已經(jīng)很優(yōu)秀,但是和h5py性能的對(duì)比,看這篇:



  http://www./2010/01/storing-large-numpy-arrays-on-disk-python-pickle-vs-hdf5adsf/



3、h5py



  抱歉找不到缺點(diǎn),唯一的缺點(diǎn)就是很難安裝。所以一下是h5py安裝教程。






h5py安裝:


官方教程:http://docs./en/latest/build.html#install





這里教教你,官方教程都是坑爹的:沒有源叫你apt-get,給你bin讓你make。所以這里, 我走過能行的路:





1、確定系統(tǒng)有python,numpy,libhdf5-dev,和HDF5.前三者一般都有。這里要安裝HDF5



2、去HDF5官方網(wǎng)站下載編譯好的bin(是的,盡管教程讓編譯,這里給用戶的就是編譯好的bin,搞得我這小白編譯了半天);



  http://www./HDF5/



3、解壓,重命名文件夾為hdf5,移動(dòng)到 /usr/local/hdf5 下



4、添加環(huán)境變量:



  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] )
# 創(chuàng)建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()



讀?。?/p>


import numpy as np
import h5py
# 讀方式打開文件
file=h5py.File('TrainSet_rotate.h5','r')
# 盡管后面有 '[:]', 但是矩陣怎么進(jìn)去的就是怎么出來的,不會(huì)被拉長(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()



好了,你已經(jīng)會(huì)使用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")



前面的方法會(huì)好用點(diǎn)


    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多