Я пытался отследить проблему с памятью в течение нескольких дней - моя программа использует около 3 ГБ памяти, тогда как она должна использовать около 200–300 МБ. Valgrind фактически сообщает, что он использует ~ 300 МБ на пике, и не сообщает об утечках памяти.
Программа читает входной файл и сохраняет каждое уникальное слово в этом файле. Он многопоточный, и я запускаю его, используя 4 потока. Мои основные источники данных:
- Массив постоянного размера wchar_t (всего 4 МБ)
- Карта между словами и списком связанных значений. Это растет с размером ввода. Если во входном файле содержится 1 000 000 уникальных слов, в дереве будет 1 000 000 записей.
Я делаю огромное количество выделений и освобождений (используя new и delete) - как минимум два на одно уникальное слово. Возможно ли, что свободная память по какой-то причине не используется повторно, из-за чего программа продолжает получать все больше и больше памяти? Он продолжает захватывать больше, продолжая бежать.
В общем, есть идеи о том, куда я должен идти отсюда?
Редактировать 1 (по совету Грэма):
Один из путей, который я попробую, - это минимизация распределения. Я буду работать с одной строкой на поток (которая может иногда увеличиваться, если слово длиннее, чем эта строка), но если я правильно запомню свой код, это исключит огромное количество вызовов new / delete. Если все пойдет хорошо, у меня останутся: одноразовое распределение входного буфера, одноразовое выделение строки на поток (с некоторыми перераспределениями), два выделения на запись в карте (одно для ключа, одно для значения).
Спасибо!