释放IPython中巨大numpy阵列的内存
更新:-此问题在机器重新启动后自行解决。现在还不能弄清楚为什么以前会发生这种错误 我有一个函数,它加载一个巨大的numpy数组(~980MB)并返回它 当我第一次启动Ipython并调用此函数时,它会毫无问题地将数组加载到变量中 但如果我再次运行相同的命令,它将退出并引发“内存错误” 我试了以下方法释放IPython中巨大numpy阵列的内存,python,memory-management,numpy,ipython,Python,Memory Management,Numpy,Ipython,更新:-此问题在机器重新启动后自行解决。现在还不能弄清楚为什么以前会发生这种错误 我有一个函数,它加载一个巨大的numpy数组(~980MB)并返回它 当我第一次启动Ipython并调用此函数时,它会毫无问题地将数组加载到变量中 但如果我再次运行相同的命令,它将退出并引发“内存错误” 我试了以下方法 del hugeArray 还是发生了同样的错误。 我甚至试过以下方法 del hugeArray gc.collect() gc.collect() 最初,gc.collect()返回145,
del hugeArray
还是发生了同样的错误。
我甚至试过以下方法
del hugeArray
gc.collect()
gc.collect()
最初,gc.collect()
返回145,第二次调用返回48。
但即使在这之后,当我调用函数时,它仍然会引发内存错误
我能再次加载的唯一方法是重新启动ipython。
我可以做些什么来释放ipython中的所有内存,这样我就不必重新启动它了吗
----------------更新
以下是%whos
Variable Type Data/Info
------------------------------
gc module <module 'gc' (built-in)>
gr module <module 'Generate4mRamp' <...>rom 'Generate4mRamp.pyc'>
np module <module 'numpy' from '/us<...>ages/numpy/__init__.pyc'>
plt module <module 'matplotlib.pyplo<...>s/matplotlib/pyplot.pyc'>
此错误仅在Ipython中发生。在简单python(>>>)中,在给出
del testcube
之后,没有内存错误。您正在查看值吗?IPython缓存输出变量,例如,Out[8]
,因此如果您检查它,它将保存在内存中
您可以执行
%xdel testcube
删除变量并将其从IPython的缓存中删除。或者,%reset out
或%reset array
将清除您的所有输出历史记录,或仅清除对numpy数组的引用。您可以尝试在ipython中调用whos
以找出占用内存的内容吗?@tiago:我已经添加了%whos命令的输出。除了我加载的模块外,它不显示任何内容。在删除它之前,你能显示对象的引用计数吗<代码>导入系统;sys.getrefcount(testcube)sys.getrefcount(testcube)给了我输出2Hey,突然它开始工作了。执行del命令后,可以再次运行该功能,而不会出现内存错误。我将试着看看其间发生了什么变化。我不是在看IPython中的值。但感谢您提供有关Ipython缓存输出的信息。我不知道这件事。下次出现此错误时,我也将尝试此xdel命令。现在,一切正常。这有什么原因不能正常工作吗?我试着做一些类似于list([I**2代表范围内的I(30000000)])
的事情来测试这个,然后我试着做%reset out。Out在此之后为空,但内存仍像重置命令之前一样被占用,为什么会这样?就好像它只是删除了引用。但不释放内存?我应该添加%reset,而不使用out
来执行操作。它会清空内存并删除引用。但我不想失去我自己的变量。同样,这也可以工作v=Out[18]%xdel v
。这是为什么?%xdel
试图在IPython的机器中查找并删除对对象的所有引用。
import numpy as np
import gc
def functionH():
cube=np.zeros((200,1024,1024))
return cube
testcube=functionH() #Runs without any issue
del testcube
testcube=functionH() # Raises Memory Error
del testcube
gc.collect()
gc.collect()
testcube=functionH() # Still Raises Memory Error