zoukankan      html  css  js  c++  java
  • 数据操作-节省内存

    一、

    运行一些操作可能会导致为新的结果分配内存。例如,如果我们用 Y = X + Y,我们将取消引用 Y 指向的张量,而是指向新分配的内存处的张量。

    开辟新的内存空间有如下问题:

    1、在机器学习中,我们可能有数百兆的参数,并且在一秒内多次更新所有参数。通常情况下,我们希望原地执行这些更新。

    2、我们可能通过多个变量指向相同参数。如果我们不原地更新,其他引用仍然会指向旧的内存位置,这样我们的某些代码可能会无意中引用旧的参数

    before = id(Y)
    print(id(Y))
    
    # X+=Y和Y=Y+X的区别在于是否开辟新的内存空间
    Y = Y + X
    print(id(Y))
    
    print(id(Y) == before)
    
    #输出结果
    
    2256463431360
    2256464070656
    False
    
    #通过输出结果我们可以发现,两者id值不一样,说明在运行y=y+x后开辟了新的内存空间
    

      

    二、执行原地操作

    我们可以使用切片表示法将操作的结果分配给先前分配的数组,例如 Y[:] = <expression>

    # 创建一个和Y形状相同、元素全是0的矩阵Z
    Z = torch.zeros_like(Y)
    
    print('id(Z):', id(Z))
    Z[:] = X + Y
    print('id(Z):', id(Z))

    #输出结果
    id(Z): 2256464178944
    id(Z): 2256464178944

    可以发现虽然 Z 的id值没有变化(表示他们没有重新分配内存)。可是他也新开辟了一个内存空间用来存储 Z 。通过如下操作可以真正减少操作的内存开销

    print(id(X))
    
    X += Y
    print(id(X))
    
    X[:]=X+Y
    print(id(X))
    
    #输出结果
    
    2256463463360
    2256463463360
    2256463463360

    可以发现,在经过X+Y后X的id值还是没有变化,这才是真正的减少内存开销

  • 相关阅读:
    混用Int与IntPtr导致GetProcAddress始终返回null
    Net中获取程序集路径
    Sql server 2014 同一数据库换名还原,导致同名库一直处于还原状态
    微耕N3000注入
    Xaramin IOS 开发常见问题
    Vs2017 xaramin mac build agent部署后记
    Git 笔记
    spring AOP
    JAVA 反射原理
    Hyperledger Fabric:fabric private data技术【官方文档翻译】
  • 原文地址:https://www.cnblogs.com/xiaoqing-ing/p/15047529.html
Copyright © 2011-2022 走看看