使用h5py库读写超过内存的大数据python
在简单数据的读操做中,咱们一般一次性把数据所有读入到内存中。读写超过内存的大数据时,有别于简单数据的读写操做,受限于内存大小,一般须要指定位置、指定区域读写操做,避免无关数据的读写。git
h5py库恰好能够实现这一功能。github
import h5py X= np.random.rand(100, 1000, 1000).astype('float32') y = np.random.rand(1, 1000, 1000).astype('float32') h5f = h5py.File('data.h5', 'w') h5f.create_dataset('X_train', data=X) h5f.create_dataset('y_train', data=y) h5f.close() # Load hdf5 dataset h5f = h5py.File('data.h5', 'r') X = h5f['X_train'] Y = h5f['y_train'] h5f.close()
- | mode |
---|---|
r | Readonly, file must exist |
r+ | Read/write, file must exist |
w | Create file, truncate if exists |
w- or x | Create file, fail if exists |
a | Read/write if exists, create otherwise (default) |
import sys import h5py import numpy as np def save_h5(times=0): if times == 0: h5f = h5py.File('data.h5', 'w') dataset = h5f.create_dataset("data", (100, 1000, 1000), maxshape=(None, 1000, 1000), # chunks=(1, 1000, 1000), dtype='float32') else: h5f = h5py.File('data.h5', 'a') dataset = h5f['data'] # 关键:这里的h5f与dataset并不包含真正的数据, # 只是包含了数据的相关信息,不会占据内存空间 # # 仅当使用数组索引操做(eg. dataset[0:10]) # 或类方法.value(eg. dataset.value() or dataset.[()])时数据被读入内存中 a = np.random.rand(100, 1000, 1000).astype('float32') # 调整数据预留存储空间(能够一次性调大些) dataset.resize([times*100+100, 1000, 1000]) # 数据被读入内存 dataset[times*100:times*100+100] = a # print(sys.getsizeof(h5f)) h5f.close() def load_h5(): h5f = h5py.File('data.h5', 'r') data = h5f['data'][0:10] # print(data) if __name__ == '__main__': # save_h5(0) for i in range(20): save_h5(i) # 部分数据导入内存 load_h5()
脚本在第一次保存时设置为建立模式,以后调整为追加模式。数组
有人可能会有疑惑,你说了这么多,但我仍是不知道这玩意到底该怎么用。
别急,基于keras框架与SRCNN网络,利用HDF5库可以读写超过内存的大数据的特色,我本身写了个单图像超分辨率demo以供参考。网络
https://github.com/JiJingYu/SRCNN-keras-hdf5框架