有人可以解决以下问题吗?
我正在处理的程序需要反转大型密集方阵。在我的8Gb RAM计算机上,无论是在Linux / gcc还是Windows / msvc中工作,对于大于大约16000的矩阵大小,内存分配都会失败。
这大约代表16000 x 16000 x sizeof(double)= 2 Gb。 通常,未来的用户会希望增大尺寸,最好是没有限制。
仅以单精度存储是不够的:仅将限制推回sqrt(2)倍,无论如何,精度损失是不可接受的。
有没有办法解决这个问题?
预先感谢您的建议。
答案 0 :(得分:0)
我按照您的提示进行了操作,看来我可能一直在吠错树。问题出在Qt容器类QVector<double>
上,在matsize = 17,000(即2Gb)分配失败。找不到有关此限制的任何文档。
以下使用std::vector<double>
容器并用g ++编译的程序可以增加到matsize = 30,000。
请求matsize = 32,000会导致KDE桌面冻结,不幸的是,没有引发或捕获异常,需要重新启动。
我将切换到std :: vector,对于我的目的来说应该足够好了。
#include <iostream>
#include <vector>
#include <string.h>
int main(int argc, char *argv[])
{
int matsize = 16000;
if (argc >= 2) {
matsize = atoi(argv[1]);
printf("input size = %d \n", matsize);
}
std::vector<double> aij;
int size2 = matsize * matsize;
double mb = size2 * sizeof(double) /1024/1024;
try
{
aij.resize(size2); // is a std::vector<double>
memset(aij.data(), 0, size2 * sizeof(double));
}
catch(std::bad_alloc exception)
{
std::cout << exception.what() << std::endl;
std::cout << "Request for"<< mb<<"Mb failed\n" << std::endl;
return 0;
}
catch(...)
{
std::cout << "Unknown error, request for"<< mb<<"Mb failed\n" << std::endl;
return 0;
}
std::cout << "Allocating "<< mb<<"Mb for the influence matrix" << std::endl;
return 0;
}
答案 1 :(得分:0)
在运行Unix的较旧的DEC Vax和Sun架构上部署了历史代码,称为“ vadvise()”-我们很少将其用于图像处理应用程序,以更明确地控制内存利用率。
我不确定这种方法是否值得复杂化,您可以在此处找到更多详细信息: