密集方阵需要较大的RAM

时间:2018-07-19 08:02:28

标签: c++ matrix ram

有人可以解决以下问题吗?

我正在处理的程序需要反转大型密集方阵。在我的8Gb RAM计算机上,无论是在Linux / gcc还是Windows / msvc中工作,对于大于大约16000的矩阵大小,内存分配都会失败。

这大约代表16000 x 16000 x sizeof(double)= 2 Gb。 通常,未来的用户会希望增大尺寸,最好是没有限制。

仅以单精度存储是不够的:仅将限制推回sqrt(2)倍,无论如何,精度损失是不可接受的。

有没有办法解决这个问题?

预先感谢您的建议。

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()”-我们很少将其用于图像处理应用程序,以更明确地控制内存利用率。

我不确定这种方法是否值得复杂化,您可以在此处找到更多详细信息:

http://icps.u-strasbg.fr/~bastoul/local_copies/lee.html