1. Tensor 内部存储结构

tensor 数据结构如下图所示,tensor 分为头信息区(Tensor)和存储区 (Storage),信息区主要保存着 Tensor 的形状(size)、步长(stride)、数据类型(type )等信息,而真正的数据则保存成连续的数组。

由于数据动辄成千数万,因此信息区占用内存较少,主要内存占用取决于 tensor 中元素数目,即存储区大小。

2. 存储区

一般来说,一个 tensor 有着与之对应的 storagestorage 是在 data 之上封装的接口。不同 tensor 的头信息一般不同,但却可能使用相同的 storage

In [25]: a = t.arange(0, 6)In [26]: a
Out[26]: tensor([0, 1, 2, 3, 4, 5])In [27]: a.storage()
Out[27]: 012345
[torch.LongStorage of size 6]In [28]: a.storage_offset()
Out[28]: 0In [29]: a.storage_type()
Out[29]: torch.LongStorageIn [30]: b = a.view(2,3)In [31]: b.storage()
Out[31]: 012345
[torch.LongStorage of size 6]In [32]:

可以通过 Pythonid 值来判断它们在内存中的地址是否相等。

In [32]: id(a) == id(b)
Out[32]: FalseIn [33]: id(a.storage) == id(b.storage)
Out[33]: TrueIn [34]:

可以看到 abstorage 是相等的。

a 改变,b 也跟着改变,因为它们是共享 storage 的。

In [34]: a[1] = 100In [35]: b
Out[35]:
tensor([[  0, 100,   2],[  3,   4,   5]])

数据和存储区的差异,c 的数据是切片之后的值,而存储区仍然是整体的值。

In [36]: c = a[2:]In [37]: c
Out[37]: tensor([2, 3, 4, 5])In [43]: c.data
Out[43]: tensor([2, 3, 4, 5])In [38]: c.storage()
Out[38]: 01002345
[torch.LongStorage of size 6]In [39]: c.data_ptr(), a.data_ptr()
Out[39]: (132078864, 132078848)In [40]: c.data_ptr() - a.data_ptr()
Out[40]: 16

data_ptr() 返回 tensor 首元素的内存地址,ca 的内存地址相差 16,也就是两个元素,即每个元素占用 8 个字节(LongStorage)。

c[0] 的内存地址对应 a[2] 内存地址。

In [44]: c[0] = -100In [45]: a
Out[45]: tensor([   0,  100, -100,    3,    4,    5])

a.storageb.storagec.storage 三者的内存地址是相等的。

In [49]: id(a.storage) == id(b.storage) == id(c.storage)
Out[49]: TrueIn [51]: a.storage_offset(), b.storage_offset(), c.storage_offset()
Out[51]: (0, 0, 2)In [52]:

查看偏移位。

In [55]: d = b[::2, ::2]In [56]: d
Out[56]: tensor([[   0, -100]])In [57]: b
Out[57]:
tensor([[   0,  100, -100],[   3,    4,    5]])In [58]: id(d.storage) == id(b.storage)
Out[58]: TrueIn [59]: b.stride()
Out[59]: (3, 1)In [60]: d.stride()
Out[60]: (6, 2)In [61]: d.is_contiguous()
Out[61]: False

由此可见,绝大多数操作并不修改 tensor 的数据,只是修改了 tensor 的头信息,这种做法更节省内存,同时提升了处理速度。此外,有些操作会导致 tensor 不连续,这时需要调用 torch.contiguous 方法将其变成连续的数据,该方法会复制数据到新的内存,不在与原来的数据共享 storage

高级索引一般不共享 storage ,而普通索引共享 storage ,是因为普通索引可以通过修改 tensoroffsetstridesize 实现,不修改 storage 的数据,而高级索引则不行。

PyTorch 笔记(11)— Tensor内部存储结构(头信息区 Tensor,存储区 Storage)相关推荐

  1. Redis存储结构体信息,选hash还是string?

    点击关注公众号,实用技术文章及时了解 来源:blog.csdn.net/u010145219/article/details/99427693 在讲到使用hash还是string存储的选择前,先了解R ...

  2. 解析redis存储结构丨 redis与mysql存储对比丨redis存储原理分析

    90分钟视频讲解搞懂redis存储原理 1. redis与mysql存储对比 2. redis存储原理分析 3. redis存储与持久化的关系 [后端开发系列]解析redis存储结构丨 redis与m ...

  3. 广义表头尾链表存储结构_单向循环链表的存储结构和操作

    单向循环链表的存储结构 单向循环链表(Circular Linked List)是单向链表的一种扩充,当单向链表带有头结点时,把单向链表中尾结点的指针域由空指针改为头结点的指针(当单向链表不带头结点时 ...

  4. 基于链式存储结构图书信息表各项操作

    ​#include<iostream> #include<iomanip> #include<string> using namespace std; #defin ...

  5. 【数据存储结构】int32的二进制存储形式

    1.事情起因 最近刷leetcode遇到了10进制转换2进制相关的问题,当遇到负数的时候发现跟思考的不一样,-1并不是 1000 ... 0001,而是1111 ... 1111,究其原因是负数以补码 ...

  6. 【笔记11】uniapp点击复制;mysql数据库存储emoji表情;Java 二维码生成;uniapp引入自定义图标

    目录 前言 一.uniapp 实现点击复制某段文本 二.MySQL 数据库存储 emoji 表情 三.Layui 的富文本编辑器 四.谷歌 Java 二维码生成 (1) 引入 MAVEN 依赖 五.微 ...

  7. 属于oracle的物理存储结构,说明 Oracle 数据库物理存储结构的组成及其功能。

    [多选题]各类型汽车的转向桥结构基本相同,组成主要包括? ( ) [单选题]亚当与夏娃赤身露体便拿什么树的叶子为自己编作裙子? [多选题]烘焙专用油脂主要包括?( ). [单选题]对创业活动的目标及实 ...

  8. 二叉树的存储结构顺序存储和链式存储

    顺序存储 实现:将一棵二叉树按照当做一棵满二叉树进行编号(从上到下,从左到右),编号作为数组的下标,一次存放到二叉树的数据元素. 当一个二叉树不是完全二叉树,那么总会有一些位置没有元素,那么就将这些位 ...

  9. windows内核开发学习笔记四十四:注册表存储结构-储巢

    上一篇文章学习了注册表的逻辑结构,接下来我这篇文章来学习注册表的存储结构.注册表实际存储是由一组储巢构成,每个储巢包含了一个由键和值构成的层次结构.下面表是windows的各个储巢的注册表路径和文件路 ...

  10. (八)InnoDB数据存储结构

    InnoDB数据存储结构 1.数据库的存储结构:页 1.1.磁盘与内存交互基本单位:页 1.2.页的结构概述 1.3.页的大小 1.4.页的上层结构 2.页的内部结构 第1部分:File Header ...

最新文章

  1. Bitcoin.com支持BCH第N弹——派息神器SLP Dividend Calculator
  2. ERROR: ld.so: object 'libgtk3-nocsd.so.0' from LD_PRELOAD cannot be preloaded
  3. C++:基于范围的for循环
  4. 视觉SLAM笔记(46) 基本的 VO
  5. c语言怎么实现模块化vc,原创:在C语言中大概实现VC++中的CArray部分功能的两种方法...
  6. AcWing 901. 滑雪(记忆化搜索)
  7. ACL2021 | 探讨跨句事件联合抽取问题
  8. 2.UML2 软件建模入门与提高 --- UML入门基础
  9. url中文传参乱码问题
  10. 计算机网络基础 — Bypass 网卡
  11. WebRTC自适应控制算法
  12. python中除法运算_python除法运算
  13. 基于Ubuntu 18.04配置固定IP方法
  14. css 设置文本字体间距及首行缩进
  15. java包裹邮费计算_猿实战16——承运商之搭建你的运费基石
  16. Flutter中使用device_info获取设备信息
  17. ss服务器多端口配置及密码设置^_^
  18. 正则表达式匹配任意字符(包括换行符)
  19. 回车符与换行符的区别
  20. ORA-12899: value too large for column SOAU.SJQY_QTSBSPEC.PROPERTY_6 (actual: 566, maximum: 500

热门文章

  1. 补充cpusim图片
  2. 【软件工程】VB版机房文档总结
  3. Plotly_绘图画图作图交互
  4. pytorch中的transpose()
  5. 深入理解 Embedding层的本质
  6. 天元MegEngine训练推理
  7. MindSpore模型推理
  8. 编写可调模板并使用Auto-tuner自动调谐器
  9. Timer定时器开发
  10. 3D目标检测论文阅读摘要