【问题标题】:Vector causing huge memory usage导致大量内存使用的向量
【发布时间】: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-1n-2n-3 等的空闲内存块,但总是要求一个不适合其中任何一个的n+1 大小的块。如果您可以使用 push_back 而不是 resize 并进行分配,则向量可能会更好地管理内存。

标签: c++ memory vector


【解决方案1】:

两个问题:

  1. 不要在向量上调用resize。使用push_back 添加。你不断地留下一个块,只是最微小的一点,以至于无法容纳放大的矢量。

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

【讨论】:

  • 我尝试了 1,但运气不佳。将尝试 2 并发布我的观察结果。
  • @user994144 外向量中有多少个元素?总共有多少内部元素? 10Gb 可能是合理的。
  • 矢量> myVec(257); myVec[i].reserve(2500000);我不必再调整大小了。
  • @user994144 - 我希望你打错了 - 你不会为每个内部向量保留 2.500.000 - 是吗?这完全是错误的,因为您总共只有约 70.000.000 个元素!
  • 我愿意。因为我的内在向量可能会那么长。但是提前保留所有空间会导致保留太多不必要的空间,因为所有内部向量大小的总和应该小于 7000 万。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-10-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多