Самый быстрый способ прочитать изображение из огромного несжатого tar-файла в __getitem__ пользовательского набора данных PyTorch - PullRequest
1 голос
/ 12 марта 2019

У меня огромный набор данных (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

Спасибо за любой совет

1 Ответ

1 голос
/ 12 марта 2019

tarfile, кажется, имеет кэширование для getmember, он использует getmembers() результаты.

Но если вы используете предоставленный фрагмент __getitem__, то для каждого элемента из набора данных файл tar открывается и читается полностью, извлекается один файл изображения, затем файл tar закрывается и соответствующая информация теряется.

Самый простой способ решить эту проблему - это, вероятно, открыть файл tar в наборе __init__ вашего набора данных, например self.tf = tarfile.open('data.tar'), но затем вам нужно не забыть закрыть его в конце.

...