使用来自 Python 的 1 个进程使用 HDF5 和 MPI 写入/读取大文件

Posted

技术标签:

【中文标题】使用来自 Python 的 1 个进程使用 HDF5 和 MPI 写入/读取大文件【英文标题】:Writing/reading large files with HDF5 and MPI using 1 process, from Python 【发布时间】:2015-03-15 02:35:54 【问题描述】:

当通过 h5py 和 mpi4py 使用并行 HDF5 将大型数据集写入文件时(在直接从 C 中使用 HDF5 和 MPI 时也很有可能),如果将 mpio 驱动程序与单个进程一起使用,我会收到以下错误:

OSError: Can't prepare for write data (Can't convert from size to size_i)

似乎允许的数据集的限制是 4GB,至少当内容是双数组时。如果使用更多进程来分担工作负载,或者如果在没有 mpio 驱动程序的单个 CPU 上完成,则更大的数据集可以正常工作。

这是为什么? sizesize_i 是指针类型,前者不能保存大于对应于 4GB double[] 的地址吗?这个错误最终对我来说可能不会是一个严重的问题,因为我通常会使用多个进程,但我希望我的代码即使只使用一个进程也能工作。

【问题讨论】:

只是猜测.. MPI 的文件 IO 例程来自于 90 年代中期批准的 MPI-2。 MPI 标准要求count 参数的类型为int。我认为 64 位 long int 直到 C99 才可用。 正如@eduffy 已经提到的,MPI 标准将 MPI-IO 调用中的数据项计数定义为int 类型。这并不是对原生 MPI 应用程序的真正限制,因为可以通过构造派生的 MPI 数据类型轻松绕过它(这是在 MPI-3 中保持 int 作为计数类型的基本原理)。 【参考方案1】:

我最近遇到了同样的问题,并且挖掘到了这一点:

https://www.hdfgroup.org/ftp/HDF5/releases/hdf5-1.8.1/src/unpacked/src/H5FDmpio.c

您将在哪里看到出现的错误。简而言之,当数组的大小(以字节为单位)大于 2GB 时,就会出现错误。

进一步挖掘后,将我带到了这里: https://www.hdfgroup.org/hdf5-quest.html#p2gb

描述了问题和解决方法的位置。

请看一下。

【讨论】:

以上链接无法访问。有人找到解决此问题的稳定方法吗?

以上是关于使用来自 Python 的 1 个进程使用 HDF5 和 MPI 写入/读取大文件的主要内容,如果未能解决你的问题,请参考以下文章

将使用-v7.3(HDF5)保存的Matlab稀疏矩阵加载到Python中并对其进行操作

如何使用 Python 和 h5py 读取 HDF5 属性(元数据)

Python - 快速 HDF5 时间序列数据查询

我可以从多个进程/线程写入 HDF5 文件吗?

保存到 hdf5 非常慢(Python 冻结)

将 hdf5 matlab 字符串加载到 Python 中