首页 > 解决方案 > 从 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__方法中使用了这段代码CustomDatasetfilelist.txt

感谢您的任何建议

标签: pythonimage-processingpython-imaging-librarypytorchtarfile

解决方案


tarfile似乎有缓存getmember,它重用getmembers()结果。

但是,如果您使用提供的 snipped in __getitem__,那么对于数据集中的每个项目,tar 文件都会打开并完全读取,提取一个图像文件,然后 tar 文件会关闭并且相关信息会丢失。

解决这个问题的最简单方法可能是在你的数据集中打开 tar 文件__init__like self.tf = tarfile.open('data.tar'),但是你需要记住最后关闭它。


推荐阅读