python - 在 IPython 中释放巨大的 numpy 数组的内存

标签 python memory-management numpy ipython

更新:- 这个问题在机器重启后自行解决。还无法弄清楚为什么之前会发生此错误。

我有一个函数可以加载一个巨大的 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 中发生。在简单的python(>>>)中给del testcube后,没有内存错误。

最佳答案

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

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

关于python - 在 IPython 中释放巨大的 numpy 数组的内存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16261240/

相关文章:

c - Linux 不允许我访问固定的内存区域

C Pointers & Memory - 写了一段代码...抛出异常

python - 从时间序列数据中进行基于相位的事件检测

python - 不除以零时为 "Divide by zero encountered in log"

python - paramiko Channel.recv() 究竟是如何工作的?

python - happybase连接hbase获取表信息失败

python - 同一图中的条形图和计数图

c++ - 为什么不为函数返回的对象调用析构函数?

python - 如何通过矩阵numpy向量化循环

Python 连接拒绝错误 : [Errno 61] Connection refused