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

时间:2013-06-12 22:37:10

标签: c++ multidimensional-array hdf5

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

我写的程序很简单,我导入一个3D的hdf5文件: A [T] [X] [E],其中T与来自模拟的每个时间步相关联,X表示测量场的位置,E(0:2)表示x,y,z中的电场。 /> A中的每个元素都是double,bin大小跨越: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] - &gt; B [T] [X],例如E的x分量。

对于冗长的帖子感到抱歉,但我希望尽可能清楚,并再次强调我有兴趣学习如何编写最快,最有效的代码。 我感谢您的所有建议,时间和智慧。

1 个答案:

答案 0 :(得分:3)

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

我不建议为这样的维度制作矢量矢量矢量。

相反,创建一维数组来存储所有值

double *bufnew = new double[DIM1*DIM2*DIM3];

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

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

应该可以正常工作。