c++ - 内存分配失败

标签 c++ out-of-memory

<分区>

我正在创建一个简单的计算系统,它可以进行一些计算并存储所有结果。我需要存储大约 36000 个时间步长,空间粒度为 100 万个元素。看来我需要分配 36000 * 1000000 * sizeof(double) = 237.191 MB,这在具有 16 GB RAM 内存的 PC 上应该不是问题。但是在 522 时间步我得到了 bad_alloc。是我的计算有误,还是 Windows 上有一些非常严格的内存管理规则?

代码是:

int timeSteps=std::ceil(3600.*10./1.); //10 hours with 1 second step
int Nx=1000, Ny=1000; //grid resolution in x and y direction

cout<<"Time steps "<<timeSteps<<endl;
cout<<"Grid dimensions Nx*Ny "<<Nx<<"*"<<Ny<<endl;
cout<<"Total memory used: "<<(double)(Nx*Ny*timeSteps*sizeof(double))/1000000.<<" MB"<<endl;

std::vector<double*> timeStepSolution;
timeStepSolution.reserve(timeSteps);

for (int i=0;i<timeSteps;i++)
{
    cout<<i<<endl;
    double *p=new double[Nx*Ny];
    timeStepSolution.push_back(p);
}

for (int i=0;i<timeSteps;i++)
{
    for (int j=0;j<Nx*Ny;j++)
       timeStepSolution[i][j]=rand() % 100;
}

for (int i=0;i<timeSteps;i++)
{
    delete[] timeStepSolution[i];
}
timeStepSolution.clear();

最佳答案

36000 * 1000000 * 8 = 288000000000 bytes

这是:

288000000000 / 1024 = 2812500000.00 kilobytes

281250000.00 / 1024 = 274658.20 megabytes

274658.20 / 1024 = 268.22 gigabytes

你是 slightly off在你的计算中。

关于c++ - 内存分配失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40132071/

相关文章:

c++ - Visual C++ native 内存管理最佳实践

c++ - ScrollWheel 没有生成任何事件 - GLUT

python-3.x - joblib 转储时出现内存错误

Mac 上的 Java OutOfMemory,在 Windows 上工作

java - 列出目录中的文件时内存不足

c++ - 将多个 for 循环组合成单个迭代器

c++ - "symbol(s) not found for architecture x86_64"由于 C 函数而导致的错误

c++ - 使用 argv[1] 作为文件名问题

从大表读取时出现 java.lang.OutOfMemoryError

java - 使用 Apache POI 进行低内存写入/读取