Проблема:
У меня есть многопоточная программа C ++, которая обрабатывает довольно много данных (несколько ГБ). В какой-то момент моей программе не хватает основной памяти, чего я хочу избежать. Теоретически этого не должно происходить, так как объем данных, которые анализирует эта программа, все еще намного меньше, чем моя основная память.
Предполагаемая проблема root:
Я предполагаю, что в какой-то момент я передаю все эти данные по значению какой-то функции или какой-то глупой ошибке. Это увеличивает объем используемой памяти, и у меня заканчивается основная память.
Как найти код, вызывающий проблему?
Я хотел бы профилировать использование памяти моей программой для каждой отдельной функции. Таким образом, результат должен быть примерно таким (где функции f
и g
являются функциями):
f used 10% of total memory used
g used 1% of total memory used
Как указано в в этом посте , я посмотрел на массив Вальгринд . Выглядит как удивительный инструмент, но valgrind --tool=massif ./myProgram
занимает вечность (даже если я существенно уменьшу объем данных).
Вопрос:
Какой инструмент я могу использовать, чтобы найти «ошибку» в моем исходном коде? Я ищу что-то, что не может длиться вечно, но все же дает мне понимание, в котором я нуждаюсь. Я также готов сделать это программным путем, изменив исходный код.
Конвертер:
Компилятор: Clang 9
ОС: RHEL
C ++: std = 17