矢量导致大量内存使用

Vector causing huge memory usage

本文关键字:内存      更新时间:2023-10-16

我有一个 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);

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

编辑:

所以我只是尝试预先预留容量,这次我不必调用调整大小函数。我使用push_back函数存储值。 内存使用量仍至少为 11GB。这次的容量总和为 82500000。

运行程序前的空闲 -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. 不要在向量上调用resize。使用push_back添加到它。你不断地留下一个块,只是最小的一点太小而不适合放大的矢量。

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