如何使用h5py有效保存和加载数据集?

时间:2019-10-28 12:50:05

标签: python numpy h5py

我有一个(900, 200, 308, 311, 1)大小的数据集,其中每个样本中有200个图像,每个图像的大小为308x311。我已经从该数据集中创建了一个h5py文件(dtype:float),该文件大约在125GB左右(比实际数据大得多)。

数据创建过程本身花费了很多时间。这是我的方法:

input = []
# 900 samples
for sample in dataset:
    sequence = []
    # 200 images/sample
    for file in images:
        img = #read file
        sequence.append(img)
    input.append(sequence)
input = np.array(input).reshape(900, 200, 308, 311, 1)

with h5py.File('X.h5py', 'w') as f:
    d = f.create_dataset('X', data=input, dtype='float')

当我加载此文件时,再次需要永远将数据加载到内存中

f = h5py.File("X.h5py","r")
X = np.array(f['X'])

是否有一种有效的方法来存储和加载如此大的数据。我已经看过chunking数据,但是不确定这样做是否有帮助。另外,如果我将数据分块存储,是否可以从数据中加载一个样本而不是像以前那样加载大块?

1 个答案:

答案 0 :(得分:0)

我做了两件事,可以更快地存储和加载

  1. 我没有使用图像作为矩阵,而是使用了扁平化的向量。
  2. 我以不再需要使用float的方式对数据进行了标准化。

这两件事导致以(#samples, #time_steps, #pixels)的尺寸保存数据。然后,在加载h5py文件之后,我重新调整了numpy数组。

结果:更少的内存消耗和更快的访问时间。

感谢@ kcw8提及切片。当我想生成数据子集而不加载整个数据集时,它也有帮助。