PyTorch 笔记(11)— Tensor内部存储结构(头信息区 Tensor,存储区 Storage)
1. Tensor 内部存储结构
tensor
数据结构如下图所示,tensor
分为头信息区(Tensor
)和存储区 (Storage
),信息区主要保存着 Tensor
的形状(size
)、步长(stride
)、数据类型(type
)等信息,而真正的数据则保存成连续的数组。
由于数据动辄成千数万,因此信息区占用内存较少,主要内存占用取决于 tensor
中元素数目,即存储区大小。
2. 存储区
一般来说,一个 tensor
有着与之对应的 storage
, storage
是在 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]:
可以通过 Python
的 id
值来判断它们在内存中的地址是否相等。
In [32]: id(a) == id(b)
Out[32]: FalseIn [33]: id(a.storage) == id(b.storage)
Out[33]: TrueIn [34]:
可以看到 a
和 b
的 storage
是相等的。
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
首元素的内存地址,c
和 a
的内存地址相差 16,也就是两个元素,即每个元素占用 8 个字节(LongStorage
)。
c[0]
的内存地址对应 a[2]
内存地址。
In [44]: c[0] = -100In [45]: a
Out[45]: tensor([ 0, 100, -100, 3, 4, 5])
a.storage
、b.storage
、c.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
,是因为普通索引可以通过修改 tensor
的 offset
、stride
和 size
实现,不修改 storage
的数据,而高级索引则不行。
PyTorch 笔记(11)— Tensor内部存储结构(头信息区 Tensor,存储区 Storage)相关推荐
- Redis存储结构体信息,选hash还是string?
点击关注公众号,实用技术文章及时了解 来源:blog.csdn.net/u010145219/article/details/99427693 在讲到使用hash还是string存储的选择前,先了解R ...
- 解析redis存储结构丨 redis与mysql存储对比丨redis存储原理分析
90分钟视频讲解搞懂redis存储原理 1. redis与mysql存储对比 2. redis存储原理分析 3. redis存储与持久化的关系 [后端开发系列]解析redis存储结构丨 redis与m ...
- 广义表头尾链表存储结构_单向循环链表的存储结构和操作
单向循环链表的存储结构 单向循环链表(Circular Linked List)是单向链表的一种扩充,当单向链表带有头结点时,把单向链表中尾结点的指针域由空指针改为头结点的指针(当单向链表不带头结点时 ...
- 基于链式存储结构图书信息表各项操作
#include<iostream> #include<iomanip> #include<string> using namespace std; #defin ...
- 【数据存储结构】int32的二进制存储形式
1.事情起因 最近刷leetcode遇到了10进制转换2进制相关的问题,当遇到负数的时候发现跟思考的不一样,-1并不是 1000 ... 0001,而是1111 ... 1111,究其原因是负数以补码 ...
- 【笔记11】uniapp点击复制;mysql数据库存储emoji表情;Java 二维码生成;uniapp引入自定义图标
目录 前言 一.uniapp 实现点击复制某段文本 二.MySQL 数据库存储 emoji 表情 三.Layui 的富文本编辑器 四.谷歌 Java 二维码生成 (1) 引入 MAVEN 依赖 五.微 ...
- 属于oracle的物理存储结构,说明 Oracle 数据库物理存储结构的组成及其功能。
[多选题]各类型汽车的转向桥结构基本相同,组成主要包括? ( ) [单选题]亚当与夏娃赤身露体便拿什么树的叶子为自己编作裙子? [多选题]烘焙专用油脂主要包括?( ). [单选题]对创业活动的目标及实 ...
- 二叉树的存储结构顺序存储和链式存储
顺序存储 实现:将一棵二叉树按照当做一棵满二叉树进行编号(从上到下,从左到右),编号作为数组的下标,一次存放到二叉树的数据元素. 当一个二叉树不是完全二叉树,那么总会有一些位置没有元素,那么就将这些位 ...
- windows内核开发学习笔记四十四:注册表存储结构-储巢
上一篇文章学习了注册表的逻辑结构,接下来我这篇文章来学习注册表的存储结构.注册表实际存储是由一组储巢构成,每个储巢包含了一个由键和值构成的层次结构.下面表是windows的各个储巢的注册表路径和文件路 ...
- (八)InnoDB数据存储结构
InnoDB数据存储结构 1.数据库的存储结构:页 1.1.磁盘与内存交互基本单位:页 1.2.页的结构概述 1.3.页的大小 1.4.页的上层结构 2.页的内部结构 第1部分:File Header ...
最新文章
- Bitcoin.com支持BCH第N弹——派息神器SLP Dividend Calculator
- ERROR: ld.so: object 'libgtk3-nocsd.so.0' from LD_PRELOAD cannot be preloaded
- C++:基于范围的for循环
- 视觉SLAM笔记(46) 基本的 VO
- c语言怎么实现模块化vc,原创:在C语言中大概实现VC++中的CArray部分功能的两种方法...
- AcWing 901. 滑雪(记忆化搜索)
- ACL2021 | 探讨跨句事件联合抽取问题
- 2.UML2 软件建模入门与提高 --- UML入门基础
- url中文传参乱码问题
- 计算机网络基础 — Bypass 网卡
- WebRTC自适应控制算法
- python中除法运算_python除法运算
- 基于Ubuntu 18.04配置固定IP方法
- css 设置文本字体间距及首行缩进
- java包裹邮费计算_猿实战16——承运商之搭建你的运费基石
- Flutter中使用device_info获取设备信息
- ss服务器多端口配置及密码设置^_^
- 正则表达式匹配任意字符(包括换行符)
- 回车符与换行符的区别
- ORA-12899: value too large for column SOAU.SJQY_QTSBSPEC.PROPERTY_6 (actual: 566, maximum: 500