使用psutil.Process.memory_info的内存使用不同于Pandas.memory_usage

mus*_*ole 7 python pandas psutil

我正在分析一个程序Pandas来处理一些CSV。我psutil's Process.memory_info用来报告虚拟内存大小(vms)和常驻集大小(rss)值。我还使用Pandas DataFrame.memory_usage (df.memory_usage().sum())报告dataframes内存中的大小。

报告值vmsdf.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价值的含义?

Muh*_*man 4

这是与您的问题相关的参考:use rss or vms to track memoryRSS和的关系VMS有点混乱。您可以详细了解这些概念。您还应该知道如何计算thisthis中的总内存使用量。

**TO SUMMARIZE AND COMPLEMENT MY OPINION**:


RSS:

驻留集大小用于显示分配给进程的内存量RAM。记住 - It doesn't include memory which is swapped out

它涉及共享库中的内存,包括所有堆栈和堆内存。

虚拟管理系统:

虚拟内存大小包括进程可以访问的所有内存。包括;

换出的内存、已分配但未使用的内存以及来自共享库的内存。

例子:

假设 aProcess-X有一个 500-K 的二进制文件,并链接到 2500-K 的共享库,有 200-K 的堆栈/堆分配,其中 100-K 实际上在内存中(其余的已交换或未使用),并且它有实际上只加载了 1000-K 的共享库和 400-K 的自己的二进制文件,然后:

RSS: 400K + 1000K + 100K = 1500K
VMS: 500K + 2500K + 200K = 3200K
Run Code Online (Sandbox Code Playgroud)

在此示例中,由于部分内存是共享的,因此许多进程可能会使用它,因此如果将所有值相加,RSS您很容易就会得到比系统更多的空间。

正如您在简单运行时所看到的;

import os
import psutil
process = psutil.Process(os.getpid())
print("vms: ", process.memory_info().vms)
print("rss:", process.memory_info().rss)
Run Code Online (Sandbox Code Playgroud)

输出:

虚拟机: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)
Run Code Online (Sandbox Code Playgroud)

这是输出:

虚拟机:276295680

RSS:54116352

因此,分配的内存在被程序实际使用之前也可能不在RSS中。因此,如果您的程序预先分配了一堆内存,然后随着时间的推移使用它;

  • 您可以看到RSS上升VMS保持不变

现在,无论您使用df.memory_usage().sum()Process.memory_info,我相信RSS都包含来自动态链接库的内存。所以它们的总和RSS将超过实际使用的内存。