【问题标题】:Vector initialization causing massive memory usage向量初始化导致大量内存使用
【发布时间】:2014-05-20 02:34:32
【问题描述】:

我遇到了一个问题,即制作一些向量会占用大量 RAM。随着代码的进行,它会超过 800 MB,最终导致 std:bad_alloc 错误并终止。

我正在使用 EasyBMP 库,它的 RGBApixel 定义为 4 个无符号字符的结构,分别代表红色、绿色、蓝色、alpha。我正在尝试对所有可能的 24 位(TrueColor)像素进行索引。

我了解此代码过多,并且有更好的方法来执行此操作。但是,这之前运行得很好,我不确定我是否进行了任何更改以导致此问题。

根据我的计算,这应该只占用 64 MB,加上一些向量的开销。感觉在某些时候它是无限循环的,但我已经看了这么久的代码,以至于我无法弄清楚。任何帮助表示赞赏。

vector< vector<RGBApixel> > dict;
dict.reserve(16777216);

for (color r = 0; r < 256; r++)
{
    for (color g = 0; g < 256; g++)
    {
        for (color b = 0; b < 256; b++)
        {
            vector<RGBApixel> pixels;
            RGBApixel pixel;
            pixel.Red = r;
            pixel.Green = g;
            pixel.Blue = b;
            pixels.push_back(pixel);
            dict.push_back(pixels);
        }
    }
}

【问题讨论】:

  • RAM 使用!= 堆栈溢出。
  • 你有 1600 万个 std::vector 对象...每个可能都有自己的缓冲区...
  • 你说得对,对不起,我修正了标题。
  • 为什么要拥有 16M 个每个 1 像素的向量?
  • 我知道,这看起来很奇怪。但这是针对我正在从事的一个项目。我完全理解它并不理想,也不应该使用它,但这主要是为了我自己的学习。而且,后来,还有超过 1 个像素的向量。

标签: c++ vector


【解决方案1】:

首先,让我们用一个元素分析vector&lt;RGBApixel&gt; 的内存需求:

  • 有效载荷数据:4 个字节。

  • std::vector&lt;&gt; 实现的过度分配:可能类似于 7*4 字节 = 28 字节。

  • 动态内存分配开销:两个指针,i。 e. 8 或 16 个字节,具体取决于您的架构。

  • vector&lt;&gt; 本身的大小:两个指针 = 8 或 16 个字节。

这是 48 或 64 字节,具体取决于您的架构。

现在,让我们乘以 16777216。我的计算器显示,这是 805306368 字节 (=768 MiB) 或 1073741824 字节 (= 1 GB)。

【讨论】:

  • 我想我也觉得奇怪的是,如果我将 for 循环更改为 255 而不是 256,它在峰值时不会超过 500MB 的使用量,但增加幅度相对较小,它拍摄到 900MB 并引发错误。
  • 这真的很好奇。我真的不知道如何解释这种行为:reserve() 调用应该保证不会在大向量中进行内存重新分配,无论是 256^3 元素还是 255^3 元素。
  • 感谢您的尝试!最后一件事:有什么好的替代结构可以使用?我猜最好有一个最小的开销。我不一定要寻找连续的记忆或任何东西。但是我使用了向量的向量,因为 1. 外部向量会增长,而使用内部向量是因为它并不总是 1 个像素,稍后它将是像素的“连接”。我尝试使用指向内部数组的指针,但它仍然对内存感到疯狂。
  • 外向量很好。问题是许多小向量。我想,你的内部向量会一直很小吗?在这种情况下,最谨慎的方法可能是为像素使用某种链表其中像素保留为大向量的一部分。重要的是不要使用std::list&lt;&gt;,因为它会再次为每个单独的像素分配内存。将带有索引的列表元素链接到大向量或类似的东西中。或者不要通过使信息隐含而不是显式来构建您的巨型向量。重新审视你想要实现的算法。
猜你喜欢
  • 1970-01-01
  • 2015-04-17
  • 1970-01-01
  • 2021-07-08
  • 2011-05-18
  • 1970-01-01
  • 2023-01-08
  • 2011-03-04
  • 2020-01-05
相关资源
最近更新 更多