#pytorch
#pytorch
Вопрос:
Набор данных в стиле карты в Pytorch имеет __&etitem__()
и __len__()
, а наборы данных в стиле итерации имеют __iter__()
протокол. Если мы используем map-style, мы можем получить доступ к данным с помощью dataset[idx]
, что замечательно, однако с помощью iterable dataset мы не можем.
Мой вопрос в том, почему это различие было необходимо? Что делает случайное чтение данных таким дорогим или даже невероятным?
Ответ №1:
Я написал короткий пост о том, как использовать наборы данных PyTorch, и о разнице между набором данных в стиле карты и в стиле итерации.
По сути, вы должны использовать наборы данных в стиле карты, когда это возможно. Наборы данных в стиле карты сообщают вам свой размер заранее, их легче перетасовывать и они обеспечивают легкую параллельную загрузку.
Распространенное заблуждение заключается в том, что если ваши данные не помещаются в память, вы должны использовать набор данных в стиле iterable. Это неверно. Вы можете реализовать набор данных в стиле карты таким образом, чтобы он повторно загружал данные по мере необходимости.
Ознакомьтесь с полным сообщением здесь.
Ответ №2:
Вполне возможно, что полный набор данных не помещается в памяти (может быть на диске или доступен только по сети). Поток информации не обязательно сохранять, если вы не собираетесь обращаться к произвольным смещениям. Если вы собираетесь запрашивать данные [0], затем данные [1], затем данные [2] по сети, вы отправляете много запросов, что приводит к задержке.
Объекты, подобные Iterable (ResultSet), типичны при пошаговом чтении строк в результатах запроса к базе данных. Также возможно, что набор данных по своей сути может представлять собой поток информации, такой как данные журнала, или транзакции, или постепенно обнаруживаемые страницы, найденные веб-сканером.