无法释放之前由jupyter笔记本输出的numpy数组



我有时在使用jupyer笔记本电脑时创建大型numpy数组,发现如果按照以下示例:,内存可能不会按预期释放

# at cell [1]
import numpy as np
x = np.empty((int(1e10), ), dtype=float)
x[:] = 0
# at cell [2]
x   # so the cell output capture x
# at cell [3]
del x     # not released

然而,如果不执行单元[2],则可以释放存储器。所以我猜x被笔记本内核捕获,然后它的引用计数保持为非零
是否有任何方法可以显式地释放此类范围外的变量?

您可以通过魔术命令resetout参数清除所有输出缓存变量:

In [1]: x = np.empty(10 ** 10)
In [2]: x
Out[2]: array([0., 0., 0., ..., 0., 0., 0.])
In [3]: del x
In [4]: oldlocalskeys = set(locals())
In [5]: %reset -f out
Flushing output cache (1 entries)
In [6]: oldlocalskeys - locals().keys()
Out[6]: {'_2'}

或者,如果你只想清除变量指向的对象,你可以使用魔术命令xdel,它将一起清除缓存变量引用:

In [1]: x = np.empty(10 ** 10)
In [2]: x
Out[2]: array([0., 0., 0., ..., 0., 0., 0.])
In [3]: oldlocalskeys = set(locals())
In [4]: %xdel x
In [5]: oldlocalskeys - locals().keys()
Out[5]: {'_', '_2', 'x'}

要永久禁用输出缓存,可以在配置文件中将InteractiveShell.cache_size设置为0:

In [1]: []
[]
In [2]: {}
{}
In [3]: ()
()
In [4]: locals()
{...
'_ih': ['', '[]', '{}', '()', 'locals()'],
'_oh': {},
'_dh': [WindowsPath('C:/windows/system32')],
'In': ['', '[]', '{}', '()', 'locals()'],
'Out': {},
'get_ipython': <bound method InteractiveShell.get_ipython of <IPython.terminal.interactiveshell.TerminalInteractiveShell object at 0x000001F5B66304F0>>,
'exit': <IPython.core.autocall.ExitAutocall at 0x1f5b6630e80>,
'quit': <IPython.core.autocall.ExitAutocall at 0x1f5b6630e80>,
'_': '',
'__': '',
'___': '',
...
'_i': '()',
'_ii': '{}',
'_iii': '[]',
'_i1': '[]',
'_i2': '{}',
'_i3': '()',
'_i4': 'locals()'}

但请注意,这也会使下划线缓存无效。您无法通过1/2/3下划线访问以前的输出结果。

最新更新