torch.utils.data.dataset 的数据组织形式——python list、dict、tuple内存消耗量

news/2024/11/21 20:03:16/

在这里插入图片描述
在Pytorch中,我们需要通过torch.utils.data.dataset来实现数据的读取。torch.utils.data.dataset是一种非流式的数据读取策略,需要将数据一次性导入至内存中.如果数据规模过大,可能存在内存不够的问题。

python">import torch
from torch.utils.data import Datasetclass TestDataset(Dataset):def __init__(self, image_path, label_path):'''从image_path中读取图片代码实现xxx''''''从label_path中读取标签代码实现xxx''''''保存为data,每一个元素为data和targetdata = ...'''self.data = datadef __getitem__(self, index):'''获取图像tensor和标签label代码实现xxx'''return image_tensor, labeldef __len__(self):return len(self.data)

例如代码中,将所有image_path和label都写到self.data中,可能会爆内存。如何优化呢?

优化

优化的关键点在于怎么减少self.data的内存占用,其中每一个元素可以采用list、dict或tuple这三种python产用的数据结构,哪一种在内存效率上最优呢?
答案是:
tuple < list < dict

实验

有两种统计python对象的内存占用大小,分别是sys.getsizeofpympler.asizeof

  • sys.getsizeof 只返回对象本身占用的内存大小,不包括对象引用的其他对象的内存大小
  • pympler.asizeof 返回对象及其所有引用的对象的总内存大小
    所以采用pympler.asizeof来统计对象内存占用
python">from pympler import asizeoftuple_info = [('pth_{}'.format(i),'label_{}'.format(i)) for i in range(1000000)]
print("tuple size: {} bytes".format(asizeof.asizeof(tuple_info)))
## tuple size: 192440648 byteslist_info = [['pth_{}'.format(i),'label_{}'.format(i)] for i in range(1000000)]
print("list size: {} bytes".format(asizeof.asizeof(list_info)))
## list size: 208440648 bytesdict_info = [{'pth': 'pth_{}'.format(i),'label': 'label_{}'.format(i)} for i in range(1000000)]
print("dict size: {} bytes".format(asizeof.asizeof(dict_info)))
## dict size: 368440760 bytes

可以发现,在1000000条数据情况下,利用tuple存储比利用dict存储减少了47%的内存占用,可以省下多少钱啊!!!!!!

原理

  • python中的dict涉及到哈希表的实现,因此需要额外的存储空间。不仅如此,python3.7+的dict是有序dict,也需要下标数组来维持有序特性,需要对下标数据做存储,因此,dict的存储效率最低。
  • python中的list是动态数组,需要额外的内存来存储引用,用于适应list内数据调整。list的每个元素都有一个指向实际数据的引用指针,这会导致额外的内存开销。
  • python中的tuple是不可变的,无额外的引用指针,导致存储效率更高。

如果真的涉及特别大规模的数据读取,建议采用torch.utils.data.IterableDataset,为流式的数据读取策略,每次仅读取一部分数据进到内存中,一定不会爆内存。但存在的问题是随机性不够高。
torch.utils.data.dataset预先知道了所有数据,支持对所有数据打乱顺序。
torch.utils.data.IterableDataset只能对一部分数据打乱顺序。
两种方式各有利弊。

笔者后续会单独写篇博客,来详细讲讲这两种数据读取策略。


http://www.ppmy.cn/news/1548844.html

相关文章

14. 【.NET 8 实战--孢子记账--从单体到微服务】--简易权限--章节总结

本章重点介绍了如何在一个简单的系统中实现基本的权限管理功能。通过构建一个简单的权限控制模型&#xff0c;章节阐述了如何为用户分配权限&#xff0c;并在应用程序中进行访问控制。 一、关键要点&#xff1a; 1. 用户管理&#xff08;登录/注册/Token&#xff09; 本章节聚…

持续集成与持续部署:CI/CD简介

一、概念及含义 CI/CD 是一种在软件开发和交付过程中广泛应用的实践方法&#xff0c;它由持续集成&#xff08;Continuous Integration&#xff0c;简称 CI&#xff09;和持续交付 / 持续部署&#xff08;Continuous Delivery/Continuous Deployment&#xff0c;简称 CD&#…

机器学习—再次决定下一步做什么

通过看Jtrain和Jcv&#xff0c;即训练错误和交叉验证错误&#xff0c;或者甚至绘制学习曲线&#xff0c;你可以试着去感受一下&#xff0c;你的学习算法是高偏差还是高方差&#xff0c;一种学习算法&#xff0c;会经常看训练错误和交叉验证错误&#xff0c;尝试判断算法是高偏差…

AJAX学习(24.11.1-24.11.14)(包含HTTP协议)

AJAX学习&#xff08;24.11.1-11.14) 来源&#xff1a; 传智 | 高校学习平台-首页 传智播课&#xff1a;黑马程序员 1.服务器和客户端 1.服务器&#xff1a;存放和对外提供资源的电脑。 2.客户端&#xff08;用户&#xff09;&#xff1a;获取和消费资源的电脑。&#xff0…

2025年软考报名时是什么时候?开考科目如何安排?

2024下半年软考已经结束啦&#xff01;很多想要报考2025上半年的考生已经进入准备状态了&#xff0c;也有部分考生想问2025上半年软考会考什么科目呢&#xff1f;大概什么时候报名考试&#xff0c;在此整理了部分信息&#xff0c;供各位考生参考&#xff01; 2025年考试报名时…

6 C++ 标准库类型 string

标准库类型string表示可变长的字符序列&#xff0c;使用string类型必须首先包含头文件#include <string>。作为标准库的一部分&#xff0c;string定义在命名空间std中。 1 定义和初始化string对象 下表列出了初始化string对象的方式。 表 1&#xff1a;初始化string语句…

前端之BFC:什么是BFC、开启了BFC能解决什么问题、如何开启BFC

1.什么是BFC 通俗点讲 2.开启了BFC能解决什么问题 3.如何开启BFC 即如下代码&#xff1a;

【PPTist】开源PPT编辑器初体验

前言&#xff1a;PPTist 是一款基于 Vue3.x TypeScript 构建的开源的PPT在线编辑器&#xff0c;功能很齐全&#xff0c;体验感很好&#xff0c;下载运行也很方便&#xff0c;没有奇奇怪怪的报错&#xff0c;分享给大家&#xff0c;以后可能会出系列&#xff01; 下载运行就不…