将hdf5读入有内存问题的c++
Reading hdf5 into c++ with memory problems
我正在将我用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]
相关文章:
- 警告处理为错误这里有什么问题
- 最小硬币更换问题(自上而下方法)
- 为"adjacent"变量赋值时出现问题
- 我的神经网络不起作用 [XOR 问题]
- 在Ubuntu 16.04上安装Cilk时出现问题
- C++我的数学有什么问题,为什么我的代码不能正确循环
- 编译包含字符串的代码时遇到问题
- Project Euler问题4的错误解决方案
- 问题:什么是QAbstractItemView::NoEditTriggers的反面
- 在编译C++代码(具有dlib和opencv)到WASM时面临问题
- 在进程中对同一管道进行读取和写入时C++管道出现问题
- 静态数据成员的问题-修复链接错误会导致编译器错误
- C++ 雷神库 - 使用资源加载器类时出现问题(不命名类型)
- 一个关于在C++中重载布尔运算符的问题
- 首要问题的答案让值班员搞错了
- setlocale的C++土耳其字符串问题
- 如何重构类层次结构以避免菱形问题
- 基于boost的程序的静态链接——zlib问题
- C++格式化输出问题
- 使用mongocxx驱动程序时包含头文件问题