Использование psutil.Process.memory_info использование памяти отличается от Pandas.memory_usage - PullRequest
6 голосов
/ 14 октября 2019

Я профилирую программу, которая использует Pandas для обработки некоторых CSV. Я использую psutil's Process.memory_info, чтобы сообщить о значениях размера виртуальной памяти (vms) и Resident Set Size (rss). Я также использую Pandas DataFrame.memory_usage (df.memory_usage().sum()), чтобы сообщить размер моего dataframes в памяти.

Существует конфликт между сообщаемыми значениями vms и df.memory_usage, когда Pandas сообщает об увеличении памяти только дляdataframe чем вызов Process.memory_info сообщает для всего (однопоточного) процесса.

Например:

  • rss: 334671872 B
  • vms: 663515136 B
  • df.memory_usage (). Sum (): 670244208 B

Вызов Process.memory_info выполняется сразу после memory_usageвызов. Моим ожидаемым результатом было то, что df.memory_usage < vms всегда, но это не выдерживает. Я предполагаю, что неправильно понимаю значение vms?

1 Ответ

2 голосов
/ 05 ноября 2019

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

**TO SUMMARIZE AND COMPLEMENT MY OPINION**:


RSS:

Размер резидентного набора используется, чтобы показать, сколько памяти выделено процессу в RAM. Помните - It doesn't include memory which is swapped out.

Включает память из общих библиотек, включая всю память стека и кучи.

VMS:

Размер виртуальной памяти включает всю память, к которой может обращаться процесс. К ним относятся:

Память, которая выгружается, память, которая выделена, но не используется, и память из общих библиотек.

Пример:

Предположим, что Process-X имеет двоичный файл размером 500 К и связан с 2500 К общими библиотеками, имеет 200 К выделений стека / кучи, из которых 100 К фактически находится в памяти (rest заменяется или не используется), и он фактически загрузил только 1000 К общих библиотек и 400 К собственного двоичного файла:

RSS: 400K + 1000K + 100K = 1500K
VMS: 500K + 2500K + 200K = 3200K

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

Как вы можете видеть, когда выпросто запустите это;

import os
import psutil
process = psutil.Process(os.getpid())
print("vms: ", process.memory_info().vms)
print("rss:", process.memory_info().rss)

Вывод:

vms: 7217152

rss: 13975552

Путем простого добавления import pandas as pd, вы можете увидеть разницу.

import os
import psutil
import pandas as pd
process = psutil.Process(os.getpid())
print("vms: ", process.memory_info().vms)
print("rss:", process.memory_info().rss)

Вот вывод:

vms: 276295680

rss: 54116352

Таким образом, выделенная память также может не находиться в RSS , пока она не будет фактически использована программой. Таким образом, если ваша программа выделяет кучу памяти заранее, то использует ее с течением времени:

  • Вы можете увидеть RSS , идущий вверх и VMS оставаясь такими же .

Теперь, если вы идете с df.memory_usage().sum() или Process.memory_info, я думаю, что RSS включает в себя память отдинамически связанные библиотеки. Таким образом, сумма их RSS будет больше, чем фактическая используемая память.

...