HDF5 Python - 处理来自多个进程的读取的正确方法?

HDF5 Python - Correct way to handle reads from multiple processes?

我有一个图像生成器,可以从 HDF5 文件(通过 h5py)读取成批的 3D 张量,它使用 Python 多处理库(继承自 Keras Sequence)。

我想知道我这样做是否正确,是否可以改进。

我有一个 __getitem__ 方法被多个进程调用 N 次迭代,每次调用此方法时,我都会打开一个 HDF5 文件并读取一组给定索引的数据,然后立即关闭文件(通过上下文管理器)。

def get_dataset_items(self, dataset: str, indices: np.ndarray) -> np.ndarray:
        """Get an h5py dataset items.

        Arguments
        ---------
        dataset : str
            The dataset key.
        indices : ndarray, 
            The list of current batch indices.

        Returns
        -------
        np.ndarray
            An batch of elements.
        """
        with h5.File(self.src, 'r') as file:
            return file[dataset][indices]

这个方法看起来没有问题,但我真的不确定。我读到当从多个进程读取文件时,我们可能会遇到奇怪的东西和损坏的数据。

我看到有MPI接口和SWMR模式

我可以从这些功能中受益吗?

这不是一个明确的答案,但是对于压缩数据,我今天遇到了问题,在寻找这个修复时发现了你的问题:Giving a python file object to h5py instead of a filename, you can bypass some问题并通过多处理读取压缩数据

    # using the python file-open overcomes some complex problem
    with h5py.File( open(self.src, "rb"), "r" ) as hfile:
        # grab the data from hfile
        groups = list(h['/']) # etc

据我所知,hdf 正在尝试为压缩(分块)数据“优化”磁盘 IO。如果多个进程试图读取相同的块,您可能不想为每个进程解压缩它们。这造成了混乱。使用 python 文件对象,我们可以希望库不再知道进程正在查看相同的数据,并且将停止尝试提供帮助。