Numpy view机制内存泄漏
【摘要】 Numpy中为了避免python中的slice操作的拷贝开销,引入了view机制。在pthon中,如下代码中b会拷贝a的数据a = list(range(10))b = a[:5]而在numpy中由于view机制,如下代码b只是引用a中的数据a = np.arange(10)b = a[:5]平时来看是节约内存提升效率的一个机制,但是里面隐藏了一个坑。。。经常会碰到在循环内取出numpy数组...
Numpy中为了避免python中的slice操作的拷贝开销,引入了view机制。
在pthon中,如下代码中b会拷贝a的数据
a = list(range(10)) b = a[:5]
而在numpy中由于view机制,如下代码b只是引用a中的数据
a = np.arange(10) b = a[:5]
平时来看是节约内存提升效率的一个机制,但是里面隐藏了一个坑。。。
经常会碰到在循环内取出numpy数组一部分的操作,比如如下代码片段:
def get_nparray_view(): a = np.random.rand(1000000) b = a[:10] return b res = [] for i in range(100): res.append(get_nparray_view())
看起来可能最终只保存了100*10=1000个元素,但是内存却很容易爆掉。。。
这是因为其实返回的view(比如上述代码的b)中,保留了对原始numpy数组的引用b.base,所以在退出get_nparray_view函数时a并没有被释放,导致内存会累积爆掉
解决方法的话就是通过copy()函数切断和原始数组的联系,如下代码所示
def get_nparray_view_copy(): a = np.random.rand(1000000) b = a[:10].copy() return b res = [] for i in range(100): res.append(get_nparray_view_copy())
这样的话内存就会正常了
【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱:
cloudbbs@huaweicloud.com
- 点赞
- 收藏
- 关注作者
评论(0)