我有一个导致大量内存使用的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
答案 0 :(得分:3)
两个问题:
不要在向量上调用resize
。使用push_back
添加。你经常留下一个块,只是最小的一点,太小,不适合放大的矢量。
请勿使用free -m
来评估程序内存使用情况,因为它会衡量系统物理RAM的使用情况。这些事情之间的关系很复杂,信息非常误导。而是使用top
或ps
之类的工具来显示程序虚拟内存使用情况和/或驻留集大小。