图片数据集持久化保存(序列化)

前言

一般我们训练模型都无法一次就得到满意的结果,需要重复的调参训练。这样就会导致每次都需要重新加载图片然后转化为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。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章