Какой подход лучше всего подходит для быстрого чтения файлов с оптических приводов?
При чтении файлов с жесткого диска mmap обычно считается хорошим способом быстрого ввода данных в память. При работе с оптическими приводами доступ занимает больше времени, и вам нужно беспокоиться о более высокой задержке. Какой подход / абстракцию вы используете, чтобы скрыть / устранить как можно большую задержку и / или общее время загрузки оптического привода?
5 ответов
Там нет реальной абстракции, которую вы можете использовать. Оптические приводы имеют очень специфические характеристики, которые должны быть оптимизированы для достижения наилучшей производительности.
Несколько советов:
Самый большой убийца на оптических дисках - это время поиска. По возможности, убедитесь, что все файлы, которые вы читаете, расположены на диске последовательно и максимально плотно упакованы. Если вы должны искать, то ищите в одном направлении и как можно реже.
Асинхронное чтение также может значительно повысить производительность. Если вам нужно загрузить и обработать файлы A,B и C, то перед обработкой A вы должны начать чтение файла B, а во время обработки B вы должны читать файл C и так далее.
Как правило, чем больше данных вы можете прочитать за один раз, тем лучше, например, избегайте много маленьких операций чтения (). Вы получите теоретическую пропускную способность диска только при чтении больших объемов данных. Некоторые ОС / драйверы будут минимизировать наказание за чтение большого количества маленьких файлов путем кэширования секторов, некоторые - нет.
Выполнение большого количества проверок (имен файлов) также может быть вредным для некоторых файловых систем / ОС, где кэшируются только части оглавления.
В наших приложениях мы обычно упаковываем файлы в один или несколько "сосредоточенных" файлов и упорядочиваем их последовательно в зависимости от порядка доступа. Некоторые файлы (и каталоги) сжимаются и читаются полностью, а затем распаковываются в памяти. Это может быть выгодно, если у вас есть каталог, который содержит множество небольших файлов (например, XML или сценарии).
В основном много тестов и настроек:)
Сведите к минимуму или исключите поиски, последовательно считывая гигантские порции данных из нескольких файлов (оптимально один).
Во-первых, вы должны иметь в виду, что современные оптические приводы довольно быстро читают последовательные данные, но поиск данных по-прежнему намного медленнее, чем на HD. Поэтому, если вам нужно много искать в большом файле (например, случайным образом перемещаться по файлу 500+ МБ), на самом деле может быть быстрее сначала скопировать все 500 МБ на HD (во временный файл), что будет сделано в Последовательное, быстрое чтение, выполнение операции над временным файлом (намного быстрее, так как значительно ускоряет время доступа на HD) и снова удалите файл, если вы закончили с ним.
То же самое выше относится и к маленьким большим файлам против многих маленьких файлов. Работа с парой больших файлов намного быстрее, чем со многими маленькими файлами, поскольку каждый раз, когда вы переключаетесь с одного маленького файла на другой, огромное время поиска снова доставляет вам головную боль. По этой причине многие игры, поставляемые на оптических носителях, упаковывают игровые данные в огромные архивные файлы (например, все текстуры одного уровня находятся в одном огромном файле вместо одного маленького файла на текстуру), поэтому старайтесь держать данные хорошо структурированными в больших файлах. Вы можете читать как можно более последовательно.
HD кеширование само по себе является хорошей техникой. Я помню эту игру, хотя я забыл название, которая всегда сохраняла 3D-данные вашей среды на HD. Пока вы путешествовали по миру, он постоянно копировал данные с DVD на HD. Таким образом, окружающий 3D-пейзаж всегда был доступен на HD для быстрого доступа, однако не весь DVD был скопирован, только около 200-300 МБ было временно кэшировано на HD для экономии места на HD. Единственное, что раздражало, это то, что во время игры у вас часто возникал "шум" при доступе к DVD, однако большую часть времени весь процесс происходил только во время простоя ЦП, поэтому он не сильно влиял на игровой процесс. Только если вы постоянно очень быстро бегаете в одном и том же направлении, может случиться так, что DVD-привод откатится назад, и вдруг игра остановится с индикатором загрузки на пару секунд. Однако я играл в эти игры несколько дней и, возможно, видел этот индикатор загрузки три раза в течение одной недели. Если вы двигались медленно или не постоянно в одном и том же направлении, индикатора загрузки никогда не было.
Я не уверен, что к тому времени, когда вы это читаете, вы можете многое сделать. Вы можете взглянуть на API создания файла - вы можете передать некоторые подсказки в Windows, которые сообщают, что вы открываете файл для последовательного или произвольного доступа. Это должно позволить Windows оптимизировать стратегию кэширования, используемую для файла.
Вы можете настроить "куски", которые вы откусываете при чтении файла, чтобы сделать их больше или меньше. Вы можете получить небольшое улучшение, если прочитаете куски, кратные размеру единицы размещения на диске.
Аппаратные средства и носители могут иметь значение. Скажем, у вас есть привод DVD, который читает в 16x. Для этого потребуются носители с рейтингом 16x или выше, а некоторые накопители плохо работают с некоторыми брендами носителей. Таким образом, даже если СМИ соответствуют оценкам, вы можете не читать с максимальной скоростью. (обычно хороший обзор аппаратного обеспечения на оптическом приводе будет включать такие детали).
Расположение файлов на оптическом диске может быть важным. Был ли он сожжен все сразу? Был ли он просто подключен как диск (как R/W в пакетном режиме?). У меня нет опыта в этом, но учитывая более длительное время поиска на оптическом приводе, фрагментированные файлы могут иметь большее влияние, чем на современном жестком диске.
Медленные диски будут медленными. Сожалею. Однако аппаратное обеспечение оптического привода обычно оптимизируется для последовательного чтения, поэтому, если вы сможете заставить свой код работать таким образом, вы можете увидеть некоторое улучшение. Я сомневаюсь, что вы увидите большую разницу между mmap()
, fread()
и др., для последовательного доступа. Вы также можете настроить размер буфера чтения, кратный размеру блока накопителя, если ваша ОС еще этого не делает для вас. Оптический дисковод может иметь большие размеры блоков по сравнению с жесткими дисками, и если ваши буферы недостаточно велики, вы платите цену.