当矩阵大小超过特征矩阵类型的某个极限时,c++分配不好
c++ bad allocation when matrix size exceeds a certain limit with Eigen matrix type
在c++动态库中,我使用特征库解决了一个最小二乘问题。这个Dll是在python软件中调用的,在该软件中可以解决问题配置。在小型问题中,代码工作正常,并返回正确的解决方案。如果点数增加,则库抛出std::bad_alloc
。
更准确地说,产生简化到最大错误的代码是
try {
matrixA = new Eigen::MatrixXd(sizeX,NvalidBtuple); // initialize A
for (int i=0;i<sizeX;++i) {
int secondIndex = 0;
for (int k=0;k<btermSize;++k) {
if (bterm[k] == 1) { // select btuple that are validated by density exclusion
// product of terms
(*matrixA)(i,secondIndex) = 1.0;
secondIndex += 1;
}
}
}
} catch (std::bad_alloc& e) {
errorString = "Error 3: bad allocation in computation of coefficients!";
std::cout<<errorString<<" "<<e.what()<<std::endl;
return;
} catch (...) {
errorString = "Error 4: construction of matrix A failed! Unknown error.";
std::cout<<errorString<<std::endl;
return;
}
其中CCD_ 2被定义在具有CCD_ 3的头文件中。
如果sizeX
和NvalidBtuple
小于约20'000x3'000,则矩阵定义有效。如果大小更大,它就会崩溃。
我做测试的电脑有足够的可用内存,大约有15G的可用内存。
这是堆/堆栈问题吗?如何使库接受更大的矩阵?
欢迎发表评论。谢谢
编辑:正如下面的回答所说,我不清楚NvalidBtuple
的定义:
NvalidBtuple = 0;
for (int i=0;i<btermSize;++i) {NvalidBtuple += bterm[i];}
其中CCD_ 7是布尔向量。因此,由于在循环中我们检查if (bterm[k] == 1)
,所以secondIndex
总是小于NvalidBtuple
。
根据问题的详细信息,矩阵占用480Mb的RAM。32位应用程序只能访问2Gb的RAM(例如,在64位操作系统上,32位进程可以访问多少内存?);分配失败,因为在应用程序的地址空间中没有空闲的连续480Mb块。
解决这个问题的最佳方法是将应用程序重新编译为64位。你将无法在32位系统中运行它,但这应该不是问题,因为由于内存有限,你无论如何都无法在这样的系统上运行算法。
相关文章:
- C++向量的极限
- QUdpSocket在高频环境中的极限
- 使用 c++ 查找收敛序列的极限
- 梯度幅度的单位和极限是什么
- 即使在C 中越过初始化阵列的极限后,结果也是如此
- C++17 用于初始化模板类的折叠表达式的极限类型
- OpenMP:即使在深度极限的情况下,递归任务也比顺序慢
- 获得变量极限的优雅方法
- 我能在C/C++中得到堆栈的极限吗
- C++中多重继承的极限
- 阿特金筛子在非常高的极限下出现故障
- 编码以查找 x^2 C++ 的极限
- 检查C++中stoi()函数的int极限
- Barnes Hut和递归极限
- 将巨大的用户输入减少到极限?(C++)
- 如何在没有if-else的情况下无限循环或循环到极限