ответить "Сколько оперативной памяти выделяет мой процесс?"

от вопрос уже есть ответ здесь:

Как определить потребление ресурсов процессора и памяти внутри процесса? 9 ответов

Видите, я хотел измерить использование памяти моей программой на C ++. Изнутри программы, без профилировщиков или просмотрщиков процессов и т. Д.

Почему изнутри программы?

Измерения будут выполняться тысячи раз - должны быть автоматизированы; поэтому, следя заTask Manager, topни на что не пойдётИзмерения должны быть сделаныво время производства- снижение производительности, которое может быть вызвано профилировщиками, неприемлемо, поскольку время выполнения уже ничтожно мало (несколько часов для крупных проблемных случаев)

нота. Зачем вообще измерять? Единственная причина для измерения используемой памяти (как сообщает ОС), а не для расчета «ожидаемого» использования заранее, заключается в том, что я не могу напрямую, аналитически «sizeof”Сколько использует моя основная структура данных. Сама структура

unordered_map<bitset, map<uint16_t, int64_t> >

они упакованы вvector для меня все равно (аlist на самом деле тоже будет достаточно, мне нужен только доступ к «соседним» структурам; без подробностей об использовании памяти я с трудом решаю какой выбрать)

vector< unordered_map<bitset, map<uint16_t, int64_t> > >

так что если кто-нибудь знает, как «увеличить размер» памяти, занимаемой такой структурой, это также решит проблему (хотя мне, вероятно, придется раскошелиться на вопрос или что-то в этом роде).

Среда: Можно предположить, что программа работает в одиночку на данном компьютере (конечно, вместе с ОС и т. Д., Либо с ПК, либо с узлом суперкомпьютера); несомненно, это единственная программа, требующая большого (скажем,> 512 МБ) объема памяти -среда вычислительного эксперимента, Программа запускается либо на моем домашнем ПК (16 ГБ ОЗУ; Windows 7 или Linux Mint 18.1), либо на узле суперкомпьютера учреждения (около 100 ГБ ОЗУ, CentOS 7) и программе.может хотеть потреблять всю эту оперативную память.Заметка что суперкомпьютер эффективно запрещает замену пользовательских процессов на диске, а мой домашний компьютер имеет небольшой файл подкачки.

Шаблон использования памяти. Программа может быть сказанопоследовательно заполнить своего рода таблицу, каждая строка в которой являетсяvector<...> как указано выше. Скажем, основная структура данных называетсяsupp, Тогда для каждого целогоk, чтобызаполнить supp[k]данные изsupp[k-1] необходимо. Какsupp[k] заполнен он используется дляинициализировать supp[k+1], Таким образом, в каждый раз,этот, предыдущая, а такжеследующий «Строки таблицы» должны быть легко доступны. После заполнения таблицы программа выполняет относительно быстрый (по сравнению с «инициализацией» и заполнением таблицы) неисчерпывающий поиск в таблице, благодаря которому получается решение.Заметка что память распределяется только черезSTL контейнеры, я никогда явноnew() или жеmalloc() себя.

Вопросы. Желаемое за действительное.

Как правильно измерятьобщее использование памяти (включая обмен на диск) процессаизнутри его исходного кода (один для Windows, один для Linux)?Вероятно, должен быть другой вопрос, или, скорее, хороший сеанс поиска в Google, но все же - каков правильный (или просто простой) способ явно контролировать (скажем, поощрять или препятствовать) обмен на диск? Указатель на авторитетную книгу по этому вопросу будет очень приветствоваться. Опять же, прости мое невежество, я хотел бы сказать что-то вроде «НИКОГДА не меняй местамиsupp»Или« своп »supp[10]«; затем, когда мне это нужно, «отменитьsupp[10]«- все из кода программы. Я подумал, что мне придется разрешить сериализовать структуры данных и явно сохранить их в виде двоичного файла, а затем выполнить обратное преобразование.

В Linux оказалось проще всего просто перехватить указатели кучи с помощью sbrk (0), привести их к 64-битным целым числам без знака и вычислить разницу после выделения памяти, и этот подход дал правдоподобные результаты (не делал более строгих). тестов пока нет).

редактировать 5. Удалена ссылка наHeapAlloc пререканий-неуместны.

редактировать 4. решение для Windows Этот бит кода сообщает о рабочем наборе, который совпадает с набором в диспетчере задач; это все, что я хотел - протестировано на Windows 10 x64 (протестировано поnew uint8_t[1024*1024], или скорее,new uint8_t[1ULL << howMuch]пока не в моем «производстве» пока). В Linux я бы попробовалgetrusage или что-то, чтобы получить эквивалент. Основным элементом являетсяGetProcessMemoryInfoкак предложено @IInspectable и @conio

#include<Windows.h>
#include<Psapi.h>
//get the handle to this process
auto myHandle = GetCurrentProcess();
//to fill in the process' memory usage details
PROCESS_MEMORY_COUNTERS pmc;
//return the usage (bytes), if I may
if (GetProcessMemoryInfo(myHandle, &pmc, sizeof(pmc)))
    return(pmc.WorkingSetSize);
else
    return 0;

редактировать 5. Удалена ссылка наGetProcessWorkingSetSize как неактуально Спасибо @conio.

Ответы на вопрос(2)

Ваш ответ на вопрос