Оцените использование памяти C ++ Ubuntu - PullRequest
0 голосов
/ 03 февраля 2020

У меня есть приложение с интенсивным использованием памяти, в котором в какой-то момент создаются следующие структуры:

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 МБ, на что указывает системный монитор Ubuntu. Тем не менее, мои оценки памяти, рассчитанные описанным выше способом, кажутся намного ниже и более чем на 100 МБ. Поэтому два вопроса ниже.

  • Правильн ли мой способ оценки памяти, используемой структурой Graph? Или есть лучший способ сделать это?
  • Если я уверен, что мой процесс не выделяет никакой новой памяти после вызова CreateGraph(), может ли по каким-либо другим причинам системный монитор Ubuntu показать более высокое использование памяти, чем я оценил?

1 Ответ

0 голосов
/ 03 февраля 2020

Векторы выделяют память линейно амортизированным способом. Они начинаются с одного элемента, а затем удваивают распределение всякий раз, когда им нужно больше памяти.

Таким образом, в среднем вы получаете в 1,5 раза больше необходимой памяти. Или это sqrt (2) раза? В любом случае, примерно в 1,5 раза.

Тогда, как уже упоминалось в комментарии, сам вектор нуждается в пространстве. Вероятно, по крайней мере 8 байтов для длины и 8 байтов для указателя. Если все ваши векторы малы, то эти издержки могут быть значительными.

Наконец, вы не можете доверять отчету о системной памяти, большую часть времени. Это может также перераспределить память, чтобы уменьшить накладные расходы.

...