2013-04-28 22 views
34

更新: - 在计算机重新启动后,此问题自行解决。还没有弄清楚为什么这个错误发生之前。在IPython中释放庞大的numpy数组内存

我有一个函数,加载一个巨大的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'> 

着这样的输出,GR是包含功能我模块,我用来加载数据立方体。

---------如何重现错误

下面的简单功能能够重现错误。

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 

此错误发生仅在IPython中。在给出del testcube之后,在简单的python(>>>)中,没有内存错误。

+1

你可以尝试在ipython中调用'whos'来找出什么是占用内存? – tiago 2013-04-28 09:15:35

+0

@tiago:我添加了%whos命令的输出。它不显示除我加载的模块之外的任何东西。 – indiajoe 2013-04-28 09:52:45

+0

在删除对象之前可以显示对象的引用计数吗? 'import sys; sys.getrefcount(testcube)' – HYRY 2013-04-28 11:34:35

回答

43

你在看价值吗? IPython将输出变量缓存为例如Out[8],所以如果你检查它,它会保存在内存中。

你可以做%xdel testcube删除变量并将其从IPython的缓存中删除。或者,%reset out%reset array将清除所有输出历史记录,或仅清除numpy数组的引用。

+0

我没有看IPython中的值。但是,感谢有关Ipython缓存输出的信息。我不知道这件事。当下次发生此错误时,我也会尝试使用此xdel命令。现在,一切工作正常。 – indiajoe 2013-04-29 13:18:14

+2

有没有理由不能正常工作?我试着做一些类似'list([i ** 2 for i in range(30000000)])'来测试这个,然后我尝试执行%reset。在此之后输出为空,但内存仍然像复位命令之前那样占用,为什么会这样呢?这就像它只是删除参考。但不释放内存? – Marko 2017-02-04 14:49:15

+0

我应该补充说%重置,没有'出'做的工作。它既清空内存并删除引用。但我不想放弃自己的变数。此外,这工作'v =出[18]%xdel v'。这是为什么? – Marko 2017-02-04 14:51:25