前言
一般我們訓練模型都無法一次就得到滿意的結果,需要重複的調參訓練。這樣就會導致每次都需要重新加載圖片然後轉化爲numpy數組,難道就不能一次加載之後保存成一個文件,然後下次就不用在去加載圖片,這樣會不會節省一點時間。
pickle
python自帶了一個數據持久化的工具pickle,先試試效果怎麼樣:
import pickle
# data爲已經加載的numpy數組
with open('data.pkl','wb') as f:
pickle.dump(data, f)
十萬張驗證碼用時125s,不過這個時間不重要,因爲只是一次保存,我們在意的是加載的時間。但是保存的data.pkl居然有2.6G,我的驗證碼加起來也才700M,這也太離譜了。試一下加載:
import pickle
with open('F:/X.pkl', 'rb') as f:
data = pickle.load(f)
print(data.shape)
用時10.9s,這速度還行,因爲如果直接加載圖片的話用時大概一分鐘,這差距還是挺大的。如果體積能減小的話就完美了。
hickle
簡介:基於hdf5的序列化的python實現
github地址:https://github.com/telegraphic/hickle
保存:(用時大概180s,大小爲1.09G)
import hickle
hickle.dump(data, 'data.hkl', mode='w', compression='gzip')
加載:
import hickle
data = hickle.load('data.hkl')
在使用上很人性化,和pickle的接口一樣。加載的話用時30s,有點慢,但是保存的文件大小和pickle對比起來感覺好多了。
pytables
簡介:基於hdf5的序列化的python實現,專門序列化numpy數組的工具
github地址:https://github.com/PyTables/PyTables
保存:
import tables
hdf5_file = tables.open_file("data.hdf5", mode='w')
filters = tables.Filters(complevel=5, complib='blosc')
earray = hdf5_file.create_earray(
hdf5_file.root,
'data', # 數據鍵值,加載時需要
tables.Atom.from_dtype(X.dtype), # 數據類型
shape=(0, 60, 150, 3), # 數據維度,需要有一個方向的維度爲0,表示這個方向可以擴展數據
filters=filters,
expectedrows=1000000000 # 數據估算大小
)
earray.append(X)
hdf5_file.close()
耗時80s,大小爲987M。序列化的時間和大小都是很不錯的,看看加載速度:
import tables
hdf5_file = tables.open_file("data.hdf5", mode='r')
hdf5_data = hdf5_file.root.data # 數據鍵值
print(hdf5_data.shape)
hdf5_file.close()
這個速度不可思議,10ms左右,感覺他並沒有實際加載數據。但是我試了一下取某一段的值,比如data[-10:-9]也是差不多的速度。這工具我愛了。
Bloscpack
簡介:序列化命令行工具,有python接口
guthub地址:https://github.com/Blosc/bloscpack
保存:
import bloscpack as bp
bp.pack_ndarray_to_file(X, 'data.blp')
#bp.pack_ndarray_to_file(X, 'data.blp', blosc_args=bp.args.BloscArgs(clevel=9, cname='lz4'))
用時73s,大小爲847M,加了blosc_args參數大小還變大了幾十M。
加載:
import bloscpack as bp
data = bp.unpack_ndarray_from_file('data.blp')
print(data.shape)
用時3秒,很不錯的表現,所以我用pytables。