首页 > 解决方案 > 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 似乎是我发现的最好的工具。

标签: pythonpsutil

解决方案


您正在使用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 的回答)


推荐阅读