mus*_*ole 7 python pandas psutil
我正在分析一个程序Pandas来处理一些CSV。我psutil's Process.memory_info用来报告虚拟内存大小(vms)和常驻集大小(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价值的含义?
这是与您的问题相关的参考:use rss or vms to track memory。RSS和的关系VMS有点混乱。您可以详细了解这些概念。您还应该知道如何计算this和this中的总内存使用量。
**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将超过实际使用的内存。
| 归档时间: |
|
| 查看次数: |
132 次 |
| 最近记录: |