Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/314.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
释放IPython中巨大numpy阵列的内存_Python_Memory Management_Numpy_Ipython - Fatal编程技术网

释放IPython中巨大numpy阵列的内存

释放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,

更新:-此问题在机器重新启动后自行解决。现在还不能弄清楚为什么以前会发生这种错误

我有一个函数,它加载一个巨大的numpy数组(~980MB)并返回它

当我第一次启动Ipython并调用此函数时,它会毫无问题地将数组加载到变量中

但如果我再次运行相同的命令,它将退出并引发“内存错误”

我试了以下方法

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