Кроссплатформенный подсчёт потребления памяти процессом
1,00
р.
р.
На enSO имеются аналогичные вопросы, однако в основном ответы сводятся, либо к одной из ОС, либо вообще к использованию системных утилит в командной строке. Наиболее подходящим из этих ответов к моей задаче оказался вот этот, но он выдаёт размер заимствованной процессом резидентной памяти, в то время как хотелось бы получить количество за вычетом разделяемой. Если проиллюстрировать, то требуется значение в столбике "Память":
Возможно, что достаточно как-то модифицировать пример, приведённый по ссылке выше. Дополнение Ввиду возможного недопонимания, дополню вопрос пояснением, что подразумевается под понятиями резидентная (RES) и разделяемая (SHR) память, занятая процессом. Достаточно детально этот момент расписан на этом сайте, однако попробую дать ответ, как я его понимаю, своими словами на простом примере. Имеется два текстовых редактора. Оба процесса пользуются некоей динамически подгружаемой библиотекой, выполняющей проверку орфографии. Если один редактор будет запущен на исполнение, то размер занятой им резидентной памяти будет составлять то количество байт, которое определяется его исходным кодом, плюс количество байт, которое определяется исходным кодом библиотеки по проверке орфографии. Аналогично и для второго текстового редактора. Таким образом нетрудно понять, что одно и то же количество байт, занимаемое библиотекой проферки орфографии, попадёт в счётчики резидентной памяти как одного, так и второго текстового редактора. Операционная система не будет размещать библиотеку в памяти в двух одинаковых экземплярах, она просто предоставит доступ процессам текстовых редакторов к её адресному пространству. Именно поэтому память, занимаемая библиотекой называется разделяемой. Наконец, если требуется выяснить, сколько памяти занимает каждый из текстовых редакторов без учёта всяких вспомогательных библиотек, достаточно из значения занимаемой резидентной памяти вычесть значение разделяемой. Решение, основанное на том, чтобы подсмотреть исходный код утилит командной строки является половинчатым, поскольку тоже самое в Windows будет сделать очевидно затруднительно. Хорошим ответом на вопрос могло бы быть указание конкретных системных структур (для Windows и Linux) и краткое описание флагов, которые позволят получить информацию о размере разделяемой памяти, занятой процессом. Я не случайно в вопросе привёл ссылку на решение задачи о получении размера резидентной памяти кроссплатформенно. Вполне вероятно, что для тех же самых структур достаточно использовать просто другие флаги. К сожалению, из-за пробела в знаниях системного программирования, я пока не сумел решить эту задачу самостоятельно, поэтому обратился на ruSO в поисках ответа. Дополнение 2 Под "кроссплатформенным" решением подразумевается код для двух разных систем (Linux и Windows), но собранный в одном месте. То есть для внешнего использования он универсален, тогда как внутри реализован под каждую платформу независимо: #if defined(_WIN32) ... #elif defined(__unix__) || defined(__unix) || defined(unix) ... #endif Дополнение 3 Судя по тому, что описано на msdn, информация, касающаяся разделяемой памяти, либо вообще не предоставляется, либо моё приведение аналогии понятия разделяемой памяти между Linux и Windows вообще некорректно.
Ответ psutil — вот отличный модуль, но на python. Там можно посмотреть исходники - как берется потребляемая процессом память. См proc.memory_info() и memory_full_info(). У последнего есть uss — так вот это самое то. Впрочем резидентная и разделяемая там конечно же есть.