为什么在 Python 中删除类实例后 psutil 不能准确表示可用内存?

Why doesn't psutil accurately represent available memory after deleting a class instance in Python?

提问人:JosephM 提问时间:5/22/2023 更新时间:5/22/2023 访问量:70

问:

我目前正在努力找出删除类实例后设备上实际还剩下多少内存。我尝试使用该库,但它没有正确显示我实际可用的内存。特别:psutil

import psutil

    x = torch.randint(0,255,size=(300,3,200,200),dtype=torch.float32)
    conv = Modules.Conv2D(3,3,2,10,save_flag=False)
 print("Used memory:", psutil.virtual_memory().percent,"% Free memory:", round(psutil.virtual_memory().available * 100 /
          psutil.virtual_memory().total),"%")
#Used memory: 74.0% Free memory: 26.0 %

conv是我的自定义类的一个对象,它具有不同的属性,占用大量内存(从psutil中可以看出)。现在,如果我尝试以下操作:

import gc

del conv
gc.collect()
 print("Used memory:", psutil.virtual_memory().percent,"% Free memory:", round(psutil.virtual_memory().available * 100 /
          psutil.virtual_memory().total),"%")
#Used memory: 74.0% Free memory: 26.0 %

即使我删除了实例并显式调用了 python 的垃圾回收器,内存似乎也没有被释放。虽然如果我检查Windows的资源管理器,内存实际上被清空了:

#Before executing the program --> In use: 6025 MB
exec_program()
#Program is executing and conv instance is allocated --> In use: 6899 Mb
# gc.collect is called --> In use: 6058 Mb
end_of_program()

所以问题是 psutil 不能正确表示这种情况。我的猜测是,尽管虚拟内存地址释放了内存,但即使它实际上是空的,它仍然被标记为已使用,因此存在错误陈述。有没有其他方法/库可以正确地完成我想要实现的目标? 提前致谢!gc.collect

python 内存管理 psutil del

评论


答:

0赞 Serge Ballesta 5/22/2023 #1

哎呀,内存分配和释放通常是一个灰色地带,无论是在 Python 级别,还是在操作系统级别,都很少有东西可以保证。具体来说,你无法知道在 Python 级别删除某些内容是否会将释放的内存放入(进程)本地可用列表中,还是将其返回到操作系统。

该本地可用列表之所以存在,是因为当程序执行大量内存分配/解除分配时,将内存保留在本地比将其返回到操作系统以便以后再次请求要有效得多。换句话说,psutil 会完成它的工作,并告诉您为特定进程提供了多少内存。但它不知道(因此无法告诉您)进程如何使用内存......

评论

0赞 user2357112 5/22/2023
根据问题,“如果我与 Windows 的资源管理器进行检查,内存实际上被清空了”。我不确定“Windows”资源管理器应该是什么(任务管理器?资源监视器?Windows Server 中已弃用的旧 Windows 系统资源管理器组件?别的东西?),但显然这个东西认为内存已返回到操作系统。
1赞 JosephM 5/22/2023
@user2357112 是 Windows 的资源监视器(Windows + R,resmon)