У меня огромный набор данных (2 миллиона) изображений jpg в одном несжатом файле TAR. У меня также есть текстовый файл, каждая строка - это имя изображения в TAR-файле по порядку.
img_0000001.jpg
img_0000002.jpg
img_0000003.jpg
...
и изображения в tar-файле одинаковы.
Я много искал и обнаружил, что tarfile
модуль является лучшим, но когда я попытался прочитать изображения из tar-файла, используя name
, это заняло слишком много времени. И причина в том, что каждый раз, когда я вызываю getmemeber(name)
метод, он вызывает getmembers()
метод, который сканирует весь tar-файл, затем возвращает Namespace
всех имен, а затем начинает поиск в этом Namespace
.
если это поможет, мой размер набора данных составляет 20 ГБ, один файл 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
Спасибо за любой совет