这是一个关于同时处理多个HDF5数据集同时尽可能将它们视为一个数据集的问题。
我有多个.h5
个文件,每个文件都包含数万个图像。我们来调用文件
file01.h5
file02.h5
file03.h5
我现在想要创建一个列表或数组,其中包含指向所有三个文件的所有图像的“指针”,而不实际加载图像。
这是我到目前为止所做的:
我首先打开所有文件:
file01 = h5py.File('file01.h5', 'r')
file02 = h5py.File('file02.h5', 'r')
file03 = h5py.File('file03.h5', 'r')
并将其图像数据集添加到列表中:
images = []
images.append(file01['images'])
images.append(file02['images'])
images.append(file03['images'])
其中file01['images']
是形状的HDF5数据集,例如(52722, 3, 160, 320)
,即52722张图片。到目前为止一切都很好,所有内容都没有加载到内存中。现在我想将这三个单独的图像列表合二为一,这样我就可以像使用一个大型数据集一样使用它。我试着这样做:
images = np.concatenate(images)
这是它破裂的地方。一旦我连接了三个HDF5数据集,它实际上将图像加载为Numpy数组并且我的内存不足。
解决这个问题的最佳方法是什么?
我需要一个解决方案,允许我对三个数据集进行Numpy-slice和索引,就像它是一样。
例如,假设每个数据集包含50,000个图像,并且我想加载每个数据集的第三个图像,我需要一个列表images
,它允许我将这些图像索引为
batch = images[[2, 50002, 100002]]
答案 0 :(得分:1)
HDF5引入了“虚拟数据集(VDS)”的概念。 但是,这不适用于1.10之前的版本。
我没有使用VDS功能的经验,但是h5py文档更加详细,并且h5py git存储库具有示例文件here:
'''A simple example of building a virtual dataset.
This makes four 'source' HDF5 files, each with a 1D dataset of 100 numbers.
Then it makes a single 4x100 virtual dataset in a separate file, exposing
the four sources as one dataset.
'''
import h5py
import numpy as np
# Create source files (1.h5 to 4.h5)
for n in range(1, 5):
with h5py.File('{}.h5'.format(n), 'w') as f:
d = f.create_dataset('data', (100,), 'i4')
d[:] = np.arange(100) + n
# Assemble virtual dataset
layout = h5py.VirtualLayout(shape=(4, 100), dtype='i4')
for n in range(1, 5):
filename = "{}.h5".format(n)
vsource = h5py.VirtualSource(filename, 'data', shape=(100,))
layout[n - 1] = vsource
# Add virtual dataset to output file
with h5py.File("VDS.h5", 'w', libver='latest') as f:
f.create_virtual_dataset('data', layout, fillvalue=-5)
print("Virtual dataset:")
print(f['data'][:, :10])