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

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

Ответы [ 5 ]

1 голос
/ 25 февраля 2009

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

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

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

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

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

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

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

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

1 голос
/ 25 февраля 2009

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

1 голос
/ 25 февраля 2009

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

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

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

0 голосов
/ 25 февраля 2009

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

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

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

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

0 голосов
/ 25 февраля 2009

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

...