Numpy view机制内存泄漏

举报
dailydreamer 发表于 2020/08/29 14:41:14 2020/08/29
【摘要】 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

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。