小编典典

列出ipython和jupyter中的内存使用情况

python

我的ipython内核占用了几(近十)Gb的内存。我认为这来自于一些操作期间可能产生的大型对象(矩阵,列表,numpy数组等),现在不再需要了。

我想 列出所有已定义的对象并按 其内存占用量 对其 进行 排序
。有没有简单的方法可以做到这一点?对于某些类型,有nbytes方法,但不是全部。因此,我正在寻找一种通用方法来列出我制作的所有对象及其内存占用情况。


阅读 508

收藏
2021-01-20

共1个答案

小编典典

假设你正在使用ipython或者jupyter,你需要做的工作一点点地得到一个列表中的所有对象的
已经定义。这意味着要提供一切globals()和剔除这些对象modulesbuiltinsipython 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方法可能会引起误解,因为它不包括数组对象的非元素属性消耗的内存。

我希望这有帮助。

2021-01-20