python - 从 PyTorch 自定义数据集的 __getitem__ 中的巨大未压缩 tar 文件中读取图像的最快方法
问题描述
我在一个未压缩的 TAR 文件中有一个巨大的 jpg 图像数据集(200 万)。我也有一个txt文件,每一行都是TAR文件中图片的名字,依次类推。
img_0000001.jpg
img_0000002.jpg
img_0000003.jpg
...
和 tar 文件中的图像完全相同。我搜索了很多,发现tarfile
模块是最好的,但是当我尝试使用 tar 从 tar 文件中读取图像时name
,它需要的时间太长了。原因是,每次我调用getmemeber(name)
方法时,它都会调用getmembers()
扫描整个 tar 文件的方法,然后返回Namespace
所有名称的 a,然后开始在 this 中查找Namespace
。
如果有帮助,我的数据集大小是 20GB 单个 tar 文件。
我不知道最好先提取所有然后使用我提取的文件夹CustomDataset
或直接从存档中读取。
这是我用来从 tar 文件中读取单个文件的代码:
with tarfile.open('data.tar') as tf:
tarinfo = tf.getmember('img_000001.jpg')
image = tf.extractfile(tarinfo)
image = image.read()
image = Image.open(io.BytesIO(image))
我在循环所有名称的类__getitem__
方法中使用了这段代码CustomDataset
filelist.txt
感谢您的任何建议
解决方案
tarfile
似乎有缓存getmember
,它重用getmembers()
结果。
但是,如果您使用提供的 snipped in __getitem__
,那么对于数据集中的每个项目,tar 文件都会打开并完全读取,提取一个图像文件,然后 tar 文件会关闭并且相关信息会丢失。
解决这个问题的最简单方法可能是在你的数据集中打开 tar 文件__init__
like self.tf = tarfile.open('data.tar')
,但是你需要记住最后关闭它。
推荐阅读
- javascript - 在静态网站中加载数据时增加网站加载时间
- mongodb - mongo 中的 Match 和 Average 不断产生 null
- c# - .Net 核心 HttpClient 错误?SocketException:一个现有的连接被远程主机强行关闭
- sql-server - MS SQL Server,如何修复 table.column 跨所有应用程序的变化
- winapi - 如果电源重置,如何保护带有 Win32 API 的文件不被损坏?
- string - 将 pandas 列中的列表转换为字符串
- javascript - 基于 JSON 间隔更改页面内容
- c# - 由于 App.config 文件中的错误,SQLite 无法加载数据
- excel - 需要excel公式进行多行列查找
- python - Python kivy(kivymd)如何从MD存储和加载数据