估计 Ubuntu C++内存使用情况
Estimate memory usage C++ Ubuntu
我有一个内存密集型应用程序,其中在某些时候创建了以下结构。
struct NeighborData {
int flags;
int id;
};
struct Node {
int id;
std::vector<NeighborData> neighbors;
};
struct Graph {
std::vector<Node> nodeList;
};
在应用程序执行期间,将创建Graph
数据结构。我正在尝试估计通过创建一个新的Graph
对象所使用的内存量,如下所示。
total_memory = sizeof(Node) * nodeList.capacity() + aggregate_over_all_nodes(sizeof(NeighborData) * neighbors.capacity()
我在图中有大约 3E5 个节点和大约 2E6 条边。所以这是一个相对较大的数据集。在应用程序运行期间,在某些时候,会调用方法CreateGraph()
。在生成图形时,应用程序使用的内存似乎增加了近 150 MB,如 ubuntu 系统监视器所示。但是,通过上述方法计算的内存估计值似乎要低得多,并且偏差超过100MB。因此,下面的两个问题。
- 我估计
Graph
结构使用的内存的方法是否正确?或者有更好的方法可以做到这一点吗? - 如果我确定我的进程在
CreateGraph()
调用后没有分配任何新内存,那么 ubuntu 系统监视器是否还有其他原因显示内存使用率高于我的估计?
向量以线性摊销的方式分配内存。它们从一个元素开始,然后在需要更多内存时将分配加倍。
因此,平均而言,您可以使用所需内存的 1.5 倍。还是 sqrt(2( 次?无论如何,大约是 1.5 倍。
然后,正如注释中提到的,向量本身需要空间。长度可能至少为 8 个字节,指针可能至少为 8 个字节。如果所有向量都很小,则此开销可能很大。
最后,在大多数情况下,您不能信任系统内存报告。它还可能过度分配内存以减少分配开销。
相关文章:
- 如何在没有死锁和/或争用的情况下正确使用 std::mutex C++?
- 在集合的情况下使用emplace_hint的用例是什么?
- 在没有堆的情况下用两种方法构造对象
- 如何在不中断的情况下正确使用C++中的切换用例语句中的Fallthrough
- 给定一个填充无符号字符**的 C 函数,如何在没有中间副本的情况下用数据填充 std::vector
- 在这种情况下,有没有办法用单个解决方案替换两个仅在类型上不同的相似函数?
- 为什么在一种情况下,我会收到带有字符串文字的已弃用转换警告,而在另一种情况下却没有?
- 不能在没有对象的情况下调用成员函数,但我用对象调用函数
- 在不先显式调用析构函数的情况下,在旧对象上使用placement new是否危险
- 无法在前面有多余空格的情况下获取要打印的数组.只有第一个值会用空格打印
- 在可疑的情况下发出叮当警告:函数'foo'可以用属性"noreturn"声明吗?
- 如何在没有任何JavaScript知识的情况下用PNaCl编写C++HTML5应用程序
- 如何在不使用开关大小写的情况下用C++编写菜单驱动的程序
- 在什么情况下,运算符=应该用左值/右值重载而不是复制和交换来实现
- 在没有测试用例的情况下提升单元测试框架
- 在这种情况下,为函数赋值有什么用
- 如何在没有_setmode的情况下用C++输出unicode
- 如何在没有STL的情况下用c++中的Key创建和访问内存块
- 如何在不锁定文件的情况下用C++编写文件
- clang与gcc运行时的区别:用clang构建的c++类模板在没有复制构造函数的情况下崩溃,用复制构造函数构建的gcc