python - Python psutil memory_info 上限为 4.0G
问题描述
我正在尝试使用 python psutil 模块通过它们的内存消耗来列出和排序 Windows 中所有正在运行的进程。但是,当我查询进程memory_info
属性时,各种指标都不会超过 4 GB。为什么这是有限的,我该如何解决这个问题?
我确实尝试过使用proc.memory_full_info()
which 理论上可以通过uss
内存指标解决此问题,但是我无法弄清楚如何在不导致 AccessDenied 错误的情况下执行此操作。
示例脚本:
import psutil
from psutil._common import bytes2human
procs = [p.info for p in psutil.process_iter(attrs=['memory_info', 'memory_percent', 'name'])]
for proc in sorted(procs, key=lambda p: p['memory_percent'], reverse=True):
print("{} - {}".format(proc['name'], bytes2human(getattr(proc['memory_info'], 'rss'))))
我对任何其他分析内存使用情况的方法持开放态度,psutil 似乎是我发现的最好的工具。
解决方案
您正在使用32 位 Python。默认情况下,32 位进程的内存限制为4GiB 。在软件级别上,该限制来自底层C类型限制(并且psutil的核心是用C编写的)。
例如,几乎所有[MS.Docs]: PROCESS_MEMORY_COUNTERS 结构成员都有SIZE_T类型。
例子:
32位:
>>> import sys, ctypes >>> from ctypes import wintypes >>> sys.version '3.7.3 (v3.7.3:ef4ec6ed12, Mar 25 2019, 21:26:53) [MSC v.1916 32 bit (Intel)]' >>> >>> ctypes.sizeof(wintypes.DWORD), ctypes.sizeof(ctypes.c_size_t), ctypes.sizeof(wintypes.HANDLE) (4, 4, 4)
64位:
>>> import sys, ctypes >>> from ctypes import wintypes >>> sys.version '3.7.3 (v3.7.3:ef4ec6ed12, Mar 25 2019, 22:22:05) [MSC v.1916 64 bit (AMD64)]' >>> >>> ctypes.sizeof(wintypes.DWORD), ctypes.sizeof(ctypes.c_size_t), ctypes.sizeof(wintypes.HANDLE) (4, 8, 8)
有关如何区分不同CPU架构Python进程的更多详细信息,请查看:[SO]:如何确定我的 python shell 是在 OS X 上以 32 位还是 64 位模式执行?(@CristiFati 的回答)
推荐阅读
- angular - Chart.js 无法读取未定义的属性“应用”
- javascript - 如果除第一个单元格之外的每个单元格都包含空格/为空,则隐藏表格行
- regex - 正则表达式捕获 css url 中的最后一个引号
- node.js - socket.io 消息是否加密
- javascript - 在另一个数组中的数组中获取对象的属性值
- r - 根据唯一值行数向 r 中的数据框添加一列
- r - 如何根据连接或重复信息对行进行分组?
- windows - 为什么 Jenkins 无法删除另一台机器上的远程文件夹并显示拒绝访问错误消息?
- logging - Chilkat:代理身份验证被记录
- c# - NewtonSoft Json 解析器错误:JSON 字符串中的项目符号字符