我有一些代码正在从我自己的包中运行,并且该程序使用的内存(60GB)比应有的要多得多。如何打印当前命名空间中所有对象的大小(以字节为单位),以便尝试找出该内存的使用位置?
我尝试过类似的事情
from pympler import asizeof
for objname in dir():
print(asizeof.asizeof(thing)/1024) # print size in kb
但是它不起作用,因为它只是打印包含命名空间中对象名称的字符串的大小。有没有办法获取对命名空间中所有内容的对象引用,以便使用此方法,或者是否有更好的方法来确定正在使用内存的内容?
dir()
仅返回本地范围内存在的名称。使用 locals()
函数 获取本地范围作为字典:
for obj in locals().values():
print(asizeof.asizeof(obj) / 1024)
请注意,在函数之外,
locals()
与 globals()
具有相同的映射。
如果字典中有
asizeof()
,你想过滤掉它:
for name, obj in locals().items():
if name != 'asizeof':
print(asizeof.asizeof(obj) / 1024)
不带参数的dir()
在功能上等同于sorted(locals())
(本地命名空间的键的排序列表)。
如果您更喜欢使用标准库并且还希望它们按大小排序:
import sys
objects=[]
for name,obj in locals().items():
objects.append([name,sys.getsizeof(obj)])
sorted(objects,key=lambda x: x[1],reverse=True)
您可以使用
gc.get_objects()
来获取收集器跟踪的所有对象,而不仅仅是特定命名空间中的对象。我首先使用它来计算每种类型的实例数量,因为这本身可能会给您一些线索。
from collections import Counter
import gc
c = Counter(type(o) for o in gc.get_objects())
print(c.most_common(20))
然后您可以深入查找任何可能嫌疑对象的大小。