如何使用 h5py 高效地保存和加载数据集?
How to efficiently save and load dataset with 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
数据,但我不确定这样做是否有帮助。另外,如果我将数据存储在块中,我可以从数据中加载一个样本而不是像以前那样加载块吗?
我做了两件事使存储和加载速度更快
- 我没有将图像附加为矩阵,而是使用了展平矢量。
- 我以一种不再需要使用
float
的方式对数据进行了规范化。
这两件事导致将数据保存在 (#samples, #time_steps, #pixels)
的维度中。然后我在加载 h5py
文件后重塑了 numpy 数组。
结果:更少的内存消耗和更快的访问时间。
感谢@kcw8 提到切片。当我想在不加载整个数据集的情况下生成数据的子集时,它也有帮助。
我有一个大小为 (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
数据,但我不确定这样做是否有帮助。另外,如果我将数据存储在块中,我可以从数据中加载一个样本而不是像以前那样加载块吗?
我做了两件事使存储和加载速度更快
- 我没有将图像附加为矩阵,而是使用了展平矢量。
- 我以一种不再需要使用
float
的方式对数据进行了规范化。
这两件事导致将数据保存在 (#samples, #time_steps, #pixels)
的维度中。然后我在加载 h5py
文件后重塑了 numpy 数组。
结果:更少的内存消耗和更快的访问时间。
感谢@kcw8 提到切片。当我想在不加载整个数据集的情况下生成数据的子集时,它也有帮助。