【问题标题】:Run out of ram C++内存不足 C++
【发布时间】:2021-05-14 14:09:59
【问题描述】:

我正在使用 4D 矩阵(使用 STL 向量)。通常,尺寸是不同的。例如,我正在读取一个尺寸为 192x256x128x96 的矩阵,下面的代码以 0 完成到更大的尺寸(在本例中为 256)。

while(matriz.size() < width)   //width es el tamaño de N
{
    vector<vector<vector<short>>> aux;
    matriz.push_back(aux);
}

for(auto i = 0; i < matriz.size(); i++)
{
    while(matriz[i].size() < width)
    {
        vector<vector<short>> aux;
        matriz[i].push_back(aux);
    }
}


for(auto i = 0; i < matriz.size(); i++)
    for(auto j = 0; j < matriz[i].size(); j++)
        while(matriz[i][j].size() < width)
        {
            vector<short> aux;
            matriz[i][j].push_back(aux);
        }   
            


for(auto i = 0; i < matriz.size(); i++) 
    for(auto j = 0; j < matriz[i].size(); j++)
        for(auto k = 0; k < matriz[i][j].size(); k++)  
            while(matriz[i][j][k].size() < width)  
            {
                matriz[i][j][k].push_back(0);
            }
               

该代码适用于中小型 4D 矩阵,我已经尝试使用 200x200x200x200 并且确实有效,但我需要将它与 256x256x256x256 矩阵一起使用,当我运行它时,我的计算机没有响应。

我不确定这是否是 RAM 问题。我的电脑有 12GB RAM,如果我没记错的话,矩阵的大小是 8GB。

知道如何解决这个问题吗?

编辑

如果我让程序运行,一段时间后它就会被杀死

200x200x200x200 矩阵的内存使用率为 56.7%

【问题讨论】:

  • 什么操作系统?什么版本?什么位大小?这些都是重要的问题。例如:Windows 10 Home 64 位的进程内存限制为 128 GB,远高于您的要求。但是,所有 Windows 10 32 位版本的进程内存限制为 4 GB,是您最大要求大小的一半。
  • 您的程序具有O(n^4) 时间复杂度。这意味着运行程序的时间刚刚超过某个n。这很可能是发生的事情。您的程序可以运行,但需要很长时间才能完成。
  • @Miguel Posadas 你能提供更多细节吗?你的电脑没有响应是什么意思?你要等多久?您是否还监视内存使用情况?您是正确的,它将为该矩阵分配 8GB 内存,但是因为您不调用 reserve 它也会进行 很多向量调整大小。
  • @MiguelPosadas 你说它适用于 200x200x200x200 矩阵,你能用那个矩阵再次运行它并发布内存使用情况吗?还有你的正常内存使用情况。
  • 运行发布版本(优化)通常会快很多倍。还可以尝试在填充它们之前保留向量空间,这将避免代价高昂的重新分配。见vector::reserve。最后,您不需要 push_back 清空子向量,您只需 resize() 将自动创建所需元素的向量(从而也节省时间和内存)。

标签: c++ ram


【解决方案1】:

让我们看看我是否有这个权利。

你正在生产:

  • 1 个向量持有:
  • 256 个向量,每个向量都有
  • 每个拥有 256 个向量(总共 65,536 个)
  • 256 个向量,每个向量都有(总共 16,777,216 个)
  • 256 个短裤(总共 4,294,967,296 个,或如您所指的 8,589,934,592 个字节)

我不知道每个向量本身的整个大小,但可能远低于 1k,因此您使用的内存不到 10 gig。

但是,发生了很多事情。是真的挂了,还是只需要非常非常长的时间。

一些定期的调试输出将有助于回答这个问题。

【讨论】:

  • 我已经用输出编辑了原始帖子,对不起,我应该在开始时发布它
【解决方案2】:

一些提示(来自 cmets):

  1. 运行优化构建 (-O3),这应该会加快处理速度。

  2. 在循环中使用resize() 代替push_back() 的空vector。这将防止代价高昂的重新分配。

    例如,替换

     while(matriz.size() < width)   //width es el tamaño de N
     {
         vector<vector<vector<short>>> aux;
         matriz.push_back(aux);
     }
    

     matriz.resize(width);
    

    如果您仍然需要在循环中使用push_back(),请至少提前reserve() 容量。这可以再次防止代价高昂的重新分配。重新分配向量可能会使它通常使用的内存量暂时增加一倍。

  3. 使用top 等工具实时查看机器上的内存和交换使用情况。如果您注意到使用的交换空间增加,则意味着机器内存不足。

【讨论】:

    猜你喜欢
    • 2020-12-23
    • 1970-01-01
    • 2018-12-10
    • 2012-01-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多