Какой подход лучше всего подходит для быстрого чтения файлов с оптических приводов?

StackOverflow https://stackoverflow.com/questions/586727

  •  06-09-2019
  •  | 
  •  

Вопрос

При чтении файлов с жесткого диска mmap обычно считается хорошим способом быстрого переноса данных в память.При работе с оптическими приводами доступ занимает больше времени, и вам следует беспокоиться о более высокой задержке.Какой подход/абстракцию вы используете, чтобы скрыть/устранить как можно большую задержку и/или общее время загрузки оптического привода?

Это было полезно?

Решение

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

Несколько советов:

Самый большой убийца оптических приводов — время поиска.По возможности убедитесь, что все файлы, которые вы читаете, расположены на диске последовательно и упакованы как можно плотнее.Если вам необходимо искать, то ищите в одном направлении и как можно реже.

Асинхронное чтение также может значительно повысить производительность.Если вам нужно загрузить и обработать файлы A,B и C, то перед обработкой A вам следует начать читать файл B, а во время обработки B вы должны читать файл C и так далее.

Как правило, чем больше данных вы можете прочитать за один раз, тем лучше, например, избегайте большого количества небольших операций чтения().Вы получите теоретическую пропускную способность диска только при чтении больших объемов данных.Драйверы некоторых ОС минимизируют штраф за чтение большого количества маленьких файлов за счет кэширования секторов, а некоторые нет.

Выполнение большого количества проверок существования (имени файла) также может быть вредным для некоторых файловых систем/ОС, где кэшируются только части оглавления.

В наших приложениях мы обычно упаковываем файлы в один или несколько «собранных» файлов и упорядочиваем их последовательно в зависимости от порядка доступа.Некоторые файлы (и каталоги) сжимаются и считываются целиком перед распаковкой в ​​памяти.Это может оказаться полезным, если у вас есть каталог, содержащий множество небольших файлов (например, XML или скриптов).

В общем, много тестов и настроек :)

Другие советы

Минимизируйте или исключите поиск, читая гигантские порции данных последовательно из нескольких файлов (оптимально из одного).

Во-первых, вы должны иметь в виду, что современные оптические приводы довольно быстро читают последовательные данные, но поиск данных все равно происходит намного медленнее, чем на жестких дисках.Итак, если вам нужно много искать в большом файле (например,произвольно перемещаться по файлу размером более 500 МБ), на самом деле может быть быстрее сначала скопировать все 500 МБ на HD (во временный файл), что будет выполняться при последовательном быстром чтении, выполнить операцию с временным файлом ( намного быстрее, поскольку время доступа к HD гораздо быстрее) и удалите файл снова, если вы закончили с ним.

То же самое относится и к маленьким большим файлам, и к множеству маленьких файлов.Работа с парой больших файлов происходит намного быстрее, чем с множеством маленьких файлов, поскольку каждый раз, когда вы переключаетесь с одного маленького файла на другой, огромное время поиска снова будет вызывать у вас головную боль.По этой причине многие игры, поставляемые на оптических носителях, упаковывают игровые данные в огромные архивные файлы (например,все текстуры одного уровня находятся в одном огромном файле, а не в одном маленьком файле на текстуру), поэтому старайтесь хорошо структурировать данные в больших файлах, которые можно читать как можно более последовательно.

Кэширование HD само по себе является хорошим методом.Я помню одну игру, хотя и забыл название, в которой 3D-данные вашего окружения всегда сохранялись в формате HD.Пока вы перемещались по миру, он постоянно копировал данные с DVD на HD.Таким образом, окружающий 3D-пейзаж всегда был доступен на HD для быстрого доступа, однако не весь DVD копировался, только около 200-300 МБ были временно кэшированы на HD для экономии места на HD.Единственное, что раздражало, это то, что во время игры часто возникал «шум» при доступе к DVD, однако большую часть времени весь процесс происходил только во время простоя процессора, поэтому это не особо влияло на игру.Только если постоянно очень быстро бежать в одном и том же направлении, могло случиться так, что привод DVD отвалился и вдруг игра остановилась с индикатором загрузки на пару секунд.Однако я играл в эти игры несколько дней и, возможно, видел этот индикатор загрузки три раза в течение одной недели.Если вы двигались медленно или не постоянно в одном и том же направлении, индикатора загрузки никогда не было.

Медленные диски будут медленными.Извини.Однако аппаратное обеспечение оптического привода обычно оптимизировано для последовательного чтения, поэтому, если вы сможете заставить свой код работать таким образом, вы можете увидеть некоторые улучшения.Я сомневаюсь, что вы увидите большую разницу между mmap(), fread(), и др. для последовательного доступа.Вы также можете настроить размер буфера чтения так, чтобы он был кратен размеру блока диска, если ваша ОС еще не делает этого за вас.Оптический привод может иметь большие размеры блоков по сравнению с жесткими дисками, и если ваши буферы недостаточно велики, вы платите за это цену.

Я не уверен, что к моменту прочтения вы сможете многое сделать.Вы можете посмотреть API создания файла — вы можете передать Windows несколько подсказок, сообщающих ей, что вы открываете файл для последовательного или произвольного доступа.Предполагается, что это позволит Windows оптимизировать стратегию кэширования, используемую для файла.

Вы можете настроить «куски», которые вы откусываете при чтении файла, чтобы сделать их больше или меньше.Вы можете получить небольшое улучшение, если будете читать порциями, кратными размеру единицы распределения на диске.

Аппаратное обеспечение и носители могут иметь значение.Допустим, у вас есть DVD-привод, который читает со скоростью 16x.Для этого потребуются носители с рейтингом 16x или выше, а некоторые приводы несовместимы с носителями некоторых марок.Так что даже если СМИ соответствуют рейтингам, возможно, вы читаете не на максимальной скорости.(обычно хороший обзор оборудования оптического привода включает такие подробности).

Расположение файлов на оптическом диске может иметь важное значение.Он сгорел сразу весь?Был ли он просто смонтирован как диск (например, чтение/запись в пакетном режиме?).У меня нет опыта в этом, но, учитывая более длительное время поиска на оптическом приводе, фрагментированные файлы могут иметь большее влияние, чем на современном жестком диске.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top