矢量导致巨大的内存使用

时间:2016-07-07 16:32:38

标签: c++ memory vector

我有一个导致大量内存使用的2D矢量。该向量应具有固定行数和动态列数。

vector < vector < Data >> myVec(257);

struct Data{
uint64_t v1,v2,v3,v4;
int v5,v6; 
};

Data结构的大小为40 bytes

sizeof(Data)

虽然myVec中有62,367,800个元素,但我的内存使用量超过了11GB。我知道数据的内存需求应该在(62367800*40) Bytes /(1024^3) ~ 2.32GB左右,但我不明白为什么使用率如此之高。 myVec的确切内存要求是什么?

所有内部向量的容量总和为100925440

我通过使用myVec[i].resize(myVec[i].size()+1);

扩展向量来将数据存储到向量中

另外,根据场景我想知道我可以使用哪些替代方法来提高内存使用率。

编辑:

所以我只是尝试预留容量,这次我没有调用resize功能。我使用push_back函数存储了值。内存使用量仍至少为11GB。这次的容量总和是82500000.

运行程序前

free -m输出:

            total       used       free     shared    buffers     cached
Mem:         31950       3844      28106         66          7        178
-/+ buffers/cache:       3658      28292
Swap:        37631       2521      35110

程序运行时从free -m输出(插入后暂停):

             total       used       free     shared    buffers     cached
Mem:         31950      17246      14704         65          9       3334
-/+ buffers/cache:      13901      18049
Swap:        37631       2521      35110

1 个答案:

答案 0 :(得分:3)

两个问题:

  1. 不要在向量上调用resize。使用push_back添加。你经常留下一个块,只是最小的一点,太小,不适合放大的矢量。

  2. 请勿使用free -m来评估程序内存使用情况,因为它会衡量系统物理RAM的使用情况。这些事情之间的关系很复杂,信息非常误导。而是使用topps之类的工具来显示程序虚拟内存使用情况和/或驻留集大小。