矢量导致大量内存使用
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
两个问题:
-
不要在向量上调用
resize
。使用push_back
添加到它。你不断地留下一个块,只是最小的一点太小而不适合放大的矢量。 -
不要使用
free -m
来评估程序内存使用情况,因为它测量系统物理 RAM 使用情况。这些事情之间的关系很复杂,信息非常具有误导性。相反,请使用top
或ps
等工具来显示程序虚拟内存使用情况和/或驻留集大小。
相关文章:
- 将字符串存储在c++中的稳定内存中
- C++ 指针的内存地址和指向数组的内存地址如何相同?
- Win32编译器选项和内存分配
- 当vector是tje全局变量时,c++中vector的内存管理
- 带内存和隔离功能的SQLite
- 是否可以通过C++扩展强制多个python进程共享同一内存
- 迭代时从向量和内存中删除对象
- 在C++中打印指向不同基元数据类型的指针的内存地址
- 这个指针和内存代码打印是什么?我不知道是打印垃圾还是如何打印我需要的值
- 多个文件的内存分配错误"在抛出 'std :: bad_alloc' what (): std :: bad_alloc 的实例后终止调用" [C++]
- 为什么示例代码访问IUnknown中已删除的内存
- 如何在C++类内存结构中创建"spacer"?
- 从构造函数抛出异常时如何克服内存泄漏
- malloc() 可能出现内存泄漏
- 如何理解将半精度指针转换为无符号长指针和相关的内存对齐
- 在调用FreeLibrary后,释放动态链接到具有相同版本的CRT堆的DLL的内存
- 如何针对特定情况调试和修复此双自由内存损坏问题
- 类型总是使用其大小存储在内存中吗
- 有没有一种方法可以测量c++程序的运行时内存使用情况
- 有没有一种方法可以使用placement new将堆叠对象分配给分配的内存