我正在分析一个利用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调用报告的整个(单线程)进程的内存要多。
例如:
Process.memory_info调用是在memory_usage调用之后立即进行的。我的预期结果是,df.memory_usage < vms在任何时候都是,但这并不能维持。我想我误解了vms值的含义?
发布于 2019-11-05 11:44:00
以下是与您的问题相关的参考资料:使用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 K的二进制文件,并且链接到2500 K的共享库,有200 K的堆栈/堆分配,其中100 K实际上在内存中(rest被交换或未使用),它实际上只加载了共享库的1000 K和它自己的二进制文件的400 K:
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中。所以,如果你的程序预先分配了一堆内存,那么随着时间的推移使用它;
现在,无论您使用df.memory_usage().sum()还是Process.memory_info,我相信RSS确实包含了来自动态链接库的内存。因此,它们的RSS之和将超过实际使用的内存。
https://stackoverflow.com/questions/58379570
复制相似问题