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)