Python数据存储与压缩

Python数据存储与压缩

  跑实验要用到数据集,对于一些不大的数据集,为了节省时间,有时候会先预处理,然后将各个文件存储成一个大文件,一次性读入内存,省去了每个迭代重新读入和重新预处理的时间。这里讨论一些数据存储与压缩方式,至于Tensorflow里用到的Dataset之类的数据存取不在本文范围内。
  本文主要针对以下几点进行对比分析:多Tensor存储的支持性、占用空间大小、读取方便性。


Python常用数据存储与压缩方式

1. numpy.save / numpy.savez

  利用np.save(file, obj)将单个Tensor保存为.npy文件,利用np.save(file, **obj)将多个Tensor以字典的形式存储为.npz文件,可实现多Tensor存储。

2. h5py

  利用h5py.create_dataset将多个Tensor存入同一个.h5文件,可实现多Tensor存储。

3. cPickle

  利用cPickle.dump将任意结构存入.pkl文件,可实现多Tensor存储。


存储与读取

用以下随机数据为例,给出存储和读取的代码。

X = np.random.normal(size=(100,100,100))
Y = np.random.normal(size=(100,100,100))

1. 存储

'''np.savez'''
data = {'X':X, 'Y':Y}
np.savez("test/data.npz", **data)

'''np.save'''
np.save("test/data_X.npy", X)
np.save("test/data_Y.npy", Y)

'''h5py'''
with h5py.File('test/data.h5', 'w') as f:
    f.create_dataset('X', data=X)
    f.create_dataset('Y', data=Y)

'''cPickle'''
with open('test/data.pkl', 'w') as f:
    cPickle.dump(data, f)

2. 读取

'''from .npz'''
data = np.load("test/data.npz")
X, Y = data['X'], data['Y']
print X.shape, type(X)
print Y.shape, type(Y)

'''from .npy'''
X = np.load("test/data_X.npy")
Y = np.load("test/data_Y.npy")
print X.shape, type(X)
print Y.shape, type(Y)

'''from .h5'''
with h5py.File("test/data.h5", "r") as f:
    X = f["X"][:]
    Y = f["Y"][:]
    print X.shape, type(X)
    print Y.shape, type(Y)

'''from cPickle'''
with open("test/data.pkl", "r") as f:
    data = cPickle.load(f)
    X, Y = data['X'], data['Y']
    print X.shape, type(X)
    print Y.shape, type(Y)

方法对比

存储便捷性

多Tensor存储存储便捷性
np.savez支持方便,以字典形式一次性存入
np.save支持不方便,逐个npy存储,还要tar打包
h5py支持较方便,要逐个分多次存入,注意h5py不能存入字典
cPickle支持方便,任意类型一次性存入

占用空间

占用空间gzip后zip后
np.savez16000450 / 16M15356970 / 15M15357108 / 15M
np.save16000356 / 16M15357071 / 15M15357254 / 15M
h5py16002144 / 16M15356430 / 15M15356568 / 15M
cPickle47382990 / 46M21007058 / 21M21007197 / 21M

读取

读取便捷性
np.savez方便,需注意所有存入的数据被强制转换为ndarray
np.save不方便,逐个npy分别读取
h5py方便,需注意所有存入的数据被封装为dataset
cPickle方便,读入后就是原类型

总结

  np.savez在所需存储数据全是ndarray类型时,各个方面都表现优秀;h5py可存储字典外的任意类型,有这方面的需要时可选用;cPickle虽然可存储任意类型,但其占用的空间和存取消耗的时间都明显大于其他方法,比不上h5py,如果一定要存字典,不如单独存成json

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值