我有几(几乎十)GB 的内存被 ipython 内核占用。我认为这是来自大型对象(矩阵、列表、numpy 数组……),这些对象是我在某些操作期间可能生成的,但现在我不再需要了。
我想列出我定义的所有对象并按内存占用量对它们进行排序。有没有一种简单的方法可以做到这一点?对于某些类型,有
nbytes
方法,但不适用于所有......所以我正在寻找一种通用方法来列出我创建的所有对象及其内存占用。
假设您正在使用
ipython
或jupyter
,您将需要做一些工作来获取您定义的所有对象的列表。这意味着获取 globals()
中可用的所有内容并过滤掉 modules
、builtins
、ipython objects
等对象。一旦确定拥有这些对象,就可以继续使用 sys.getsizeof
获取它们的大小。可以总结如下:
import sys
# These are the usual ipython objects, including this one you are creating
ipython_vars = ['In', 'Out', 'exit', 'quit', 'get_ipython', 'ipython_vars']
# Get a sorted list of the objects and their sizes
sorted([(x, sys.getsizeof(globals().get(x))) for x in dir() if not x.startswith('_') and x not in sys.modules and x not in ipython_vars], key=lambda x: x[1], reverse=True)
请记住,对于 python 对象(使用 python 内置函数创建的对象),
sys.getsizeof
将非常准确。但对于使用第三方库创建的对象来说,它可能有点不准确。此外,请注意,如果对象由垃圾收集器管理,则 sys.getsizeof
会增加额外的垃圾收集器开销。所以,有些东西可能看起来比实际重一些。
顺便说一句,
numpy
的.nbytes
方法可能会有些误导,因为它不包括数组对象的非元素属性消耗的内存。
我喜欢@Abdou 提供的答案!我只想添加以下建议。我会将其转换为字典,而不是元组列表。
import sys
# These are the usual ipython objects, including this one you are creating
ipython_vars = ["In", "Out", "exit", "quit", "get_ipython", "ipython_vars"]
# Get a sorted list of the objects and their sizes
mem = {
key: value
for key, value in sorted(
[
(x, sys.getsizeof(globals().get(x)))
for x in dir()
if not x.startswith("_") and x not in sys.modules and x not in ipython_vars
],
key=lambda x: x[1],
reverse=True,
)
}
那么如果我想获得以MB为单位的总金额,我所要做的就是:
sum(mem.values()) / 1e6
@Abdou 和@Daniel Cárdenas 说得很对。由于代表较低,无法向@Daniel Cárdenas 发表评论,但只有一个建议。如果您想将此代码片段转换为函数,请务必使用
for x in globals()
而不是
dir()
,因为 dir() 指的是您所在的本地范围,但我们需要全局空间中的大小。
这是我获取 MB 大小的代码版本:
import sys
def check_memory():
ipython_vars = ["In", "Out", "exit", "quit", "get_ipython", "ipython_vars"]
print("Top 10 objects with highest memory usage")
# Get a sorted list of the objects and their sizes
mem = {
key: round(value/1e6,2)
for key, value in sorted(
[
(x, sys.getsizeof(globals().get(x)))
for x in globals()
if not x.startswith("_") and x not in sys.modules and x not in ipython_vars
],
key=lambda x: x[1],
reverse=True)[:10]
}
print({key:f"{value} MB" for key,value in mem.items()})
print(f"\n{round(sum(mem.values()),2)} MB in use overall")