【发布时间】:2016-07-07 16:32:37
【问题描述】:
我有一个导致大量内存使用的二维向量。该向量应该具有固定的行数和动态的列数。
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。本次总容量为8250万。
运行程序前释放 -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,而是将其增加原始大小的 2 倍。 (或者只是让向量类管理它自己的内存;它会为你做这些。)
-
您如何测量实际使用的内存?您从哪里获得 11+ GB 指标?
-
为什么投反对票?我已经尽可能详细地描述了这个问题。
-
当您说虽然
myVec中有62,367,800 个元素,那么在myVec的元素的62,367,800 个向量中,每个向量有多少个元素? -
resize(n)的一个潜在问题是它会留下一个n-1块。很快您将拥有许多大小为n-1、n-2、n-3等的空闲内存块,但总是要求一个不适合其中任何一个的n+1大小的块。如果您可以使用push_back而不是resize并进行分配,则向量可能会更好地管理内存。