繁体   English   中英

将HDF5读入C ++并遇到内存问题

[英]Reading hdf5 into c++ with memory problems

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

我编写的程序很简单,我导入了一个3D的hdf5文件:A [T] [X] [E],其中T与模拟中的每个时间步相关联,X表示测量场的位置,E( 0:2)表示x,y,z中的电场。
A中的每个元素都是双精度,并且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]-> B [T] [X]重塑为例如,E的x分量。

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

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

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

而是创建一个一维数组来存储所有值

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

并使用以下公式进行访问以计算给定3D物品的线性位置

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

应该可以。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM