将hdf5读入有内存问题的c++

Reading hdf5 into c++ with memory problems

本文关键字:问题 c++ 内存 hdf5      更新时间:2023-10-16

我正在将我用python开发的代码重写为c++,主要是为了提高速度;同时也希望在这门语言上获得更多的经验。我还计划使用openMP将此代码并行化到48个内核上,这些内核共享204GB内存。

我写的程序很简单,我导入一个hdf5文件,它是3D的:A[T][X][E],其中T与模拟的每个时间步长相关联,X表示测量电场的位置,E(0:2)表示X,y,z处的电场。
A中的每个元素都是双精度体,容器大小跨度为:A[15000][80][3]。

我遇到的第一个问题是将这个"大"h5文件输入到数组中,在我继续之前希望得到专业意见。我的第一次尝试:

...
#define RANK  3
#define DIM1  15001
#define DIM2  80
#define DIM3  3
using namespace std;
int main (void)
{
//  Define HDF5 variables for opening file. 
hid_t   file1, dataset1;
double bufnew[DIM1][DIM2][DIM3];
herr_t ret;
uint  i, j, k;
file1 = H5Fopen (FILE1, H5F_ACC_RDWR, H5P_DEFAULT);
dataset1 = H5Dopen (file1, "EFieldOnLine", H5P_DEFAULT);
ret = H5Dread (dataset1, H5T_NATIVE_DOUBLE, H5S_ALL, H5S_ALL,
                H5P_DEFAULT, bufnew);
cout << "Let's try dumping 0->100 elements" << endl;
for(i=1; i < 100; i++) cout << bufnew[i][20][2] << endl;
...

导致数组声明中的分段错误。我的下一个动作是使用3D数组(新)或3D矢量。然而,我看到了很多反对这些方法的争论,更重要的是,我只需要E的一个分量,即我想重塑A[T][X][E] -> B[T][X],比如E的X分量。

很抱歉写了这么长一篇文章,但我想要尽可能地清楚,并想再次强调,我对学习如何编写最快、最有效的代码很感兴趣。我感谢你所有的建议,时间和智慧。

将数组定义为局部变量意味着在堆栈上分配它。堆栈通常只有几兆字节,堆栈溢出肯定会导致段故障。大型数据结构应该在堆上动态分配(使用new操作符)或静态分配(当定义为全局变量时)。

我不建议用向量的向量的向量的向量来表示这样的维度。

相反,创建一个一维数组来存储所有值
double *bufnew = new double[DIM1*DIM2*DIM3];

,并使用以下公式访问它以计算给定3D项目的线性位置

bufnew[(T*DIM2+X)*DIM3+E] = ... ; // bufnew[T][X][E]