估计 Ubuntu C++内存使用情况

Estimate memory usage C++ Ubuntu

本文关键字:用情 情况 内存 Ubuntu C++ 估计      更新时间:2023-10-16

我有一个内存密集型应用程序,其中在某些时候创建了以下结构。

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 个字节。如果所有向量都很小,则此开销可能很大。

最后,在大多数情况下,您不能信任系统内存报告。它还可能过度分配内存以减少分配开销。

相关文章: