相关疑难解决方法(0)

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

更新: - 这个问题在机器重启后解决了.还没有弄清楚为什么之前发生这种错误.

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

当我第一次启动Ipython并调用此函数时,它会将数组加载到变量中而没有任何问题.

但是,如果我再次运行相同的命令,它将退出提出"内存错误".

我试过以下,

del hugeArray
Run Code Online (Sandbox Code Playgroud)

仍然发生同样的错误.我甚至尝试了以下内容

del hugeArray
gc.collect()
gc.collect()
Run Code Online (Sandbox Code Playgroud)

最初,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'>
Run Code Online (Sandbox Code Playgroud)

除此之外,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 …
Run Code Online (Sandbox Code Playgroud)

python memory-management numpy ipython

49
推荐指数
1
解决办法
4万
查看次数

Python + Numpy:手动收集垃圾什么时候有用?

读到可以使用手动收集垃圾

gc.collect()
Run Code Online (Sandbox Code Playgroud)

现在我想知道什么时候这样做有用。我想它在某种程度上是通用的 Python 逻辑。假设我有一个大循环,并且在每个循环中都会使用大矩阵Z并一次又一次地重写它们。如果我不改变 的大小,最后删除矩阵并收集垃圾有用Z吗?

一般问题在什么情况下可以真正观察到强制垃圾收集的影响,尤其是在进行大量数值计算时numpy

python garbage-collection numpy scipy

6
推荐指数
1
解决办法
423
查看次数